防止 ComboBox 下拉菜单与其 AutoComplete 下拉菜单外观冲突

mat*_*ius 4 c# combobox winforms

我有一个ComboBoxwho DropDownStyleis DropDown,允许用户输入它和它的AutoCompleteModeis Suggest。问题是,如果ComboBox当前打开并且用户开始输入,辅助下拉列表会出现,但单击其中的项目实际上是从位于鼠标下方的 ComboBox 的原始下拉列表中选择项目点击。

我更喜欢在 ComboBox 的下拉列表打开时用户无法输入内容并想知道是否有比以下更优雅的解决方案:

  1. 设置AutoCompleteModeNone时候ComboBox是开放的
  2. 这可能会更改DropDownStyleDropDownListOnClick事件(没试过,但理论上是合理的)
  3. 在列表打开时操作(或限制)输入的文本
  4. 相似的

Rez*_*aei 6

作为一个选项,您可以处理 的KeyPress事件ComboBox并关闭下拉列表。它保持自动完成菜单打开,但关闭下拉菜单:

private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    this.comboBox1.DroppedDown = false;
}
Run Code Online (Sandbox Code Playgroud)

作为另一种选择,您可以处理DropDownDropDownClosed事件ComboBox并禁用自动完成DropDown并在DropDownClosed事件中再次启用它:

private void comboBox1_DropDown(object sender, EventArgs e)
{
    this.comboBox1.AutoCompleteMode = AutoCompleteMode.None;
}
private void comboBox1_DropDownClosed(object sender, EventArgs e)
{
    this.comboBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
}
Run Code Online (Sandbox Code Playgroud)

您可以创建一个派生自ComboBox并覆盖相应 OnXXXX方法的新类,并将逻辑放在那里。通过这种方式,您将修复程序封装在控件类中,而不是在表单中处理事件,并且将拥有可重用的无错误控件和更干净的代码。