ula*_*ekh 8 c# combobox autocomplete winforms
这是一个简短的程序,可以重现我刚遇到的问题.这是在带有.NET 4.0的MS Windows 7下编译的,以防万一有所不同.
using System;
using System.Drawing;
using System.Windows.Forms;
// Compile with "csc /target:exe /out:comboboxbug.exe /r:System.dll /r:System.Drawing.dll /r:System.Windows.Forms.dll comboboxbug.cs"
// in a Visual Studio command prompt.
static class Program
{
[STAThread]
static void Main()
{
//Create a label.
Label oLabel = new Label();
oLabel.Location = new Point (10, 10);
oLabel.Size = new Size (100, 15);
oLabel.Text = "Combo box bug:";
// Create a combo-box.
ComboBox oComboBox = new ComboBox();
oComboBox.Location = new Point (10, 50);
oComboBox.Size = new Size (150, 21);
oComboBox.Items.AddRange (new object[]
{ "A", "A B", "A C", "A B C", "A C B", "A B C D", "A C B D" });
oComboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
oComboBox.AutoCompleteSource = AutoCompleteSource.ListItems;
oComboBox.SelectionChangeCommitted
+= new EventHandler (comboBox_SelectionChangeCommitted);
// Create a form.
Form oForm = new Form();
oForm.Size = new Size (200, 150);
oForm.Controls.Add (oLabel);
oForm.Controls.Add (oComboBox);
// Run this form.
Application.Run (oForm);
}
static void comboBox_SelectionChangeCommitted (object sender,
EventArgs e)
{
MessageBox.Show ("SelectionChangeCommitted");
}
}
Run Code Online (Sandbox Code Playgroud)
单击组合框的文本部分,然后键入"A".您将获得自动填充建议列表.用鼠标单击其中一个选项.该SelectionChangeCommitted事件不会发生!
选择菜单项而不使用自动完成功能.你会看到一个消息框,显示SelectionChangeCommitted事件发生了!
鉴于用户在两种情况下都改变了选择,在两种情况下都不SelectionChangeCommitted应该调用?
使用SelectedIndexChanged事件不是一个选项,因为对于这个固定示例背后的应用程序,我只希望它在用户进行选择时发生,而不是在以编程方式设置时发生.
使用
SelectedIndexChanged事件不是一个选项,因为对于这个固定示例背后的应用程序,我只希望它在用户做出选择时发生,而不是在以编程方式设置时发生。
您还可以通过编写一个包装方法来更改暂时禁用事件的选择来实现此目的。
不幸的是,我不知道SelectionChangeCommitted针对更一般情况(例如您不控制ComboBox或如何访问它)未启动的问题的即时解决方案。
编辑:
我制作了 ComboBox 调用的所有事件的流媒体,并且似乎没有任何其他事件会执行您正在寻找的操作。我能想到的唯一解决方案是挂钩自动完成触发的事件。困难在于知道这些事件是什么,因为它们似乎不会触发ComboBox我的小测试显示的内容。