我有一个ComboBox,其DropDownStyle为DropDown,允许用户在其中键入内容,其AutoCompleteMode为Recommendation.问题在于,如果ComboBox当前处于打开状态,并且用户开始在其中输入辅助下拉列表,但单击它的某个项目实际上是从当时位于鼠标下方的ComboBox原始下拉列表中选择该项目.点击次数.
我希望在打开ComboBox的下拉列表时用户无法在其中键入内容,并且想知道是否存在比以下方法更优雅的解决方案:
>在ComboBox打开时将AutoCompleteMode设置为None
>可能在OnClick事件上将DropDownStyle更改为DropDownList(尚未尝试,但理论上是合理的)
>在列表打开时处理(或限制)输入的文本
>类似
解决方法:
作为选项,您可以处理ComboBox的KeyPress
事件并关闭下拉列表.它使自动完成菜单保持打开状态,但关闭下拉菜单:
private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
{
this.comboBox1.DroppedDown = false;
}
作为另一个选项,您可以处理ComboBox的DropDown
和DropDownClosed
事件,并在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;
}
您可以创建一个派生自ComboBox的新类,并覆盖相应的OnXXXX方法并将逻辑放在那里.这样,您可以将修复程序封装在控件类中,而不是处理表单中的事件,并且将具有可重用的无错误控件和更简洁的代码.