【发布时间】:2013-01-23 20:21:17
【问题描述】:
这是一个重现我刚刚遇到的问题的简短程序。这是在带有 .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 未被调用!我修改后的答案如下。
【问题讨论】:
-
我试过你的代码,但一切都很好。
-
this issue 有帮助吗?
-
@spajce:我运行了编写的示例源代码并复制了所描述的行为。 Win 8,VS 2010,.NET 4 客户端配置文件。 Note that the expected behavior is a pop up when selecting a value as part of auto complete.
-
显然
DropDownClosed也没有被调用,参考我之前的帖子。 -
@Guvante:是的,this issue 有帮助,但对于我在自动完成过程中单击某个项目的情况没有帮助。
标签: c# winforms autocomplete combobox