C#中的Combobox和自动完成功能

7
我在组合框的自动完成选项上遇到了一些小问题。一切都正常工作,除了我想让它以不同的方式工作 :)
当我开始在组合框中输入时,自动建议以我喜欢的方式工作:
但是,当我首次打开组合框,然后开始输入时,我得到了这样的结果:
此外,我无法从自动建议的组合框中选择项目,只能从下面的列表中选择。
自动完成模式为SuggestAppend。
我希望像第一张图片那样具有自动建议功能,并且在像第二张图片这样的情况下,第一个组合框列表应该以某种方式关闭。
7个回答

12

我曾经遇到同样的问题,解决方法如下:

private void comboBox_DropDown(object sender, EventArgs e)
{
    ComboBox cbo = (ComboBox)sender;
    cbo.PreviewKeyDown += new PreviewKeyDownEventHandler(comboBox_PreviewKeyDown);
}

private void comboBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    ComboBox cbo = (ComboBox)sender;
    cbo.PreviewKeyDown -= comboBox_PreviewKeyDown;
    if (cbo.DroppedDown) cbo.Focus();
}

一旦用户单击 DropDown 按钮,就会将 PreviewKeyDown 事件附加到该 ComboBox 上。当用户开始输入时,刚刚添加的事件被触发。在该事件中,我们检查 ComboBox 是否是 DroppedDown,如果是,则聚焦该 ComboBox。在聚焦 ComboBox 时,DropDown 就会消失,这就是全部。


5

4
是的,这对我有用。以下是您可以使用的一些代码:m_cmbNode.DropDown += (sender, e) => m_cmbNode.AutoCompleteMode = AutoCompleteMode.None; m_cmbNode.DropDownClosed += (sender, e) => m_cmbNode.AutoCompleteMode = AutoCompleteMode.SuggestAppend;(注:这是一段针对某种程序语言的代码,作用为在下拉菜单打开时禁用自动补全功能,在关闭下拉菜单时启用自动补全功能。) - bsegraves

3

我遇到了完全相同的问题。 我尝试使用DropDown和DropDownClosed事件将AutoCompleteMode属性设置为none和suggest。 在这种情况下,当使用鼠标选择项目后,SelectedIndexChanged事件不会触发。 在SelectedIndexChanged事件中我使用了SelectedValue属性,但此属性在触发DropDownClosed事件时已更改。 在我的情况下,我只需从DropDownClosed事件中调用SelectedIndexChanged方法即可解决问题。


3

在ComboBox的KeyDown事件上实现。应该像这样。

void cmbExample_KeyDown(object sender, KeyEventArgs e)
    {
        if ((sender as ComboBox).DroppedDown)
            (sender as ComboBox).DroppedDown = false;
    }

2

你是否尝试过AutoCompleteMode的其他可能取值,它们分别是Append, None, 和 Suggest?我认为你需要的是Suggest而不是AppendSuggest

如果需要,这里有一些可下载的示例代码,展示了不同的自动补全模式:下载链接


我已经尝试过它们了。Append是为了显示其余的值,并建议使用这个新的组合框窗口。我想要这个新的组合框处于建议模式。但是,第一个列表应该被关闭。 - Elfoc

2

我发现默认的UI实现分心,因为两个下拉框争夺鼠标控制。

当自动完成建议显示时,您希望隐藏下拉列表。 ComboBox在显示自动完成建议之前会发出一个Windows消息。 我选择在响应此消息时折叠下拉列表。 这需要对ComboBox进行小的覆盖才能实现:

Public Class Combobox2
    Inherits ComboBox

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        If m.Msg = 135 AndAlso DroppedDown Then 'WM_GETDLGCODE
            DroppedDown = False
        End If
        MyBase.WndProc(m)
    End Sub

End Class

0
void cmbExample_KeyDown(object sender, KeyEventArgs e)
{
  cmbExample.DroppedDown = false;
}

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