Winforms -- 多选下拉列表

22

我正在寻找一种下拉列表控件,可以允许我选择多个项目。类似于CheckedListBox,但是以下拉列表形式展示(我不希望它占据屏幕的大块空间)。目前我很确定在.NET中没有这样的内置控件。

请注意,这是Winforms,而不是ASP.NET。有什么建议吗?


4
使用Jim Lamb提到的控件(http://www.codeproject.com/KB/combobox/extending_combobox.aspx),但通过应用来自论坛上题为“PopupComboBox焦点问题的修复”的这个修复方法(http://www.codeproject.com/KB/miscctrl/simplepopup.aspx)来修复它。在`Popupcombobox.cs`文件中,在方法`protected override void WndProc(ref Message m)中,将ShowDropDown()替换为BeginInvoke(new MethodInvoker(ShowDropDown))`。这使得焦点对我有效,现在感觉不错了。 - Christian
4个回答

26

真的吗?天啊。这正是我所需要的——我希望我24小时前就发布了它!谢谢。 - AlanR
7
最终我放弃了这个复选框——它不如我最初想象的那样精致(在识别鼠标点击、自动完成等方面)。我决定使用一个弹出式对话框。尽管如此,知道这个复选框的存在肯定是值得的。 - AlanR

11

还有一种修复方法:

上面的解决方案可以解决第一个问题,使单击两次才能进入复选框列表的问题,但是它引入了一个新问题,当单击控件以退出它时,它会保留焦点,您必须双击才能转到另一个控件。我使用以下代码解决了这个问题:

在CheckBoxComboBox.cs中添加以下重写:

    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);
        this.Parent.Focus();
    }

结合 Rob P. 的答案和这个答案,它不会在任何点击事件上保持焦点。


又修复了一个问题。这个问题被 Bat 解决了。虽然这是一种不太规范的方法,但确实必要。因为您的解决方案很好,除了在打开下拉菜单时出现问题。 - Sami

3
您应该再次显示下拉表单,因为以下代码会关闭它。
下面是可行的代码:
protected override void OnClick(EventArgs e)
{
        base.OnClick(e);
        this.Parent.Focus();
        this.dropDown.Show(this);
}

虽然这个代码可以运行,但是 this.dropDown.Show(this) 会导致一些意外的副作用,例如滚动条需要额外的点击或关闭。 - rboy

3
这是另一种解决方案,从UI的角度来看更好,我发现UI更加精致,代码更易于使用/理解:https://www.codeproject.com/Articles/31105/A-ComboBox-with-a-CheckedListBox-as-a-Dropdown。请注意,需要进行一些修复才能避免双击问题,这可以在评论中找到。引用 Herrpel (9-May-17) 的话���将此添加到外部类 CheckedComboBox。
protected override void OnMouseDown(MouseEventArgs e)
{
    base.OnMouseDown(e);
    DroppedDown = false;
}

针对Windows 10关闭框失去焦点的问题,需要更改CloseDropdown中的代码:

ccbParent.Focus();
this.Hide();

to

ccbParent.BeginInvoke(new MethodInvoker(() => this.Hide()));

另外,还需要进行另一个修复:能够使用DropDownList样式。对此,有一条由“William Vincent”发表的评论 - 但对我来说不起作用。@rboy,也许你知道如何应用那个评论?谢谢。 - Daniel
1
我找到了解决方法:你必须在属性窗口中将_OwnerDrawVariable_更改为_Normal_。否则它不起作用。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接