这是一个简短的程序,可以重现我刚刚遇到的问题。这是在带有 .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");
}
}
单击组合框的文本部分并键入“A”。您将获得自动完成建议的列表。用鼠标单击其中一个选项。事件SelectionChangeCommitted
不会发生!
选择一个菜单项而不使用自动完成。您将收到一个消息框,显示该SelectionChangeCommitted
事件已发生!
鉴于在这两种情况下用户都更改了选择,在这两种情况下都不SelectionChangeCommitted
应该调用吗?
使用SelectedIndexChanged
事件不是一个选项,因为对于这个罐头示例背后的应用程序,我只希望它在用户进行选择时发生,而不是在以编程方式设置时发生。
编辑 2020 年 10 月 28 日:我发现了另一个SelectionChangeCommitted
没有被调用的案例!甚至不需要为问题发生设置自动完成!单击以打开组合框,按与组合框项目之一的开头匹配的键,然后按 Tab 键离开。组合框项目被选中,但SelectionChangeCommitted
未被调用!我修改后的答案如下。