C#中的组合框和自动完成

时间:2011-06-05 14:46:15

标签: c# winforms autocomplete combobox

我在组合框中的自动完成选项有小问题。一切都正常,除了我想要不同的工作:)

当我开始输入组合框时,autusuggest以我喜欢的方式工作:

Combo

但是当我第一次打开组合框,然后开始输入时,我会得到类似的东西:

enter image description here

我不能从autosuggest组合框中选择项目,只能从此列表中选择。

AutocompleteMode是SuggestAppend

我想在第一张图片上进行自动提示,在图片2等情况下,第一个组合框列表应该以某种方式关闭..

7 个答案:

答案 0 :(得分: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消失,就是这样。

答案 1 :(得分:5)

如何使用DropDownDropDownClosed事件来停用或更改自动完成模式?

答案 2 :(得分:3)

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

答案 3 :(得分:3)

在ComboBox KeyDown上实现事件。它看起来应该是这样的。

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

答案 4 :(得分:2)

您是否尝试了AutoCompleteMode AppendNoneSuggest的其他可能值?我认为您要找的是Suggest而不是AppendSuggest

以下是一些downloadable sample code,说明了不同的模式,如果需要的话。

答案 5 :(得分:2)

我还发现默认的UI实现会分散注意力,因为两个下拉列表都在争夺鼠标控制权。

您希望在显示自动填充建议时隐藏下拉列表。在显示自动填充建议之前,组合框会显示一条Windows消息。我选择折叠下拉列表以响应此消息。它需要对组合框进行小幅覆盖以实现此目的:

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

答案 6 :(得分:0)

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