2011-06-05 137 views
6

我在组合框中有自动完成选项的小问题。一切工作正确的,但我想工作它指出错误:)C中的组合框和自动完成#

当我开始在组合框中键入,autusuggest工作我喜欢的方式:

Combo

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

enter image description here

更重要的是我无法从自动提示组合框挑项目,只能从下面这个列表。

AutocompleteMode是SuggestAppend

我想有自动提示喜欢上了第一张照片,并在如画2的情况下,此第一框列表应该得到某种封闭..

回答

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

这工作完美! – 2014-10-23 19:42:25

2

你尝试其他AutoCompleteMode的可能值为Append,NoneSuggest?我认为你正在寻找的是Suggest而不是AppendSuggest

这里是一些downloadable sample code说明不同的模式,如果你需要它。

+0

我试过了。追加是显示其余的值,并建议这是新的组合框窗口。我想用推荐模式来创建这个新的组合框。但是,这个第一个名单应该关闭.. – Elfoc 2011-06-05 14:59:39

5

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

+4

是的,这对我很有帮助。以下是您可以使用的一些代码: 'm_cmbNode.DropDown + =(sender,e)=> m_cmbNode.AutoCompleteMode = AutoCompleteMode.None; m_cmbNode.DropDownClosed + =(sender,e)=> m_cmbNode.AutoCompleteMode = AutoCompleteMode.SuggestAppend;' – bsegraves 2012-04-16 14:07:55

+1

这应该被标记为答案 – waltmagic 2015-01-14 22:08:17

3

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

2

我还发现默认的UI实现让人分心,因为两个下拉菜单为鼠标控制而战。

想要在显示自动填充建议时隐藏下拉列表。在显示自动填充建议之前,组合框会显示一条窗口消息。为了响应此消息,我选择了折叠下拉列表。它需要一个很小的组合框覆盖来达到这个目的:

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 
3

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

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