ComboBox SelectionChangeCommitted事件不适用于AutoComplete
这是一个简短的程序,它重现了我刚刚遇到的问题。 这是使用.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
事件不是一个选项,因为对于这个封装示例背后的应用程序,我只希望它在用户进行选择时发生,而不是以编程方式设置。
使用SelectedIndexChanged
事件不是一个选项,因为对于这个封装示例背后的应用程序,我只希望它在用户进行选择时发生,而不是以编程方式设置。
你也可以通过编写一个包装方法来改变暂时禁用你的事件的选择。
不幸的是,我并不知道SelectionChangeCommitted
不是针对更一般的情况(例如,您不控制ComboBox
或访问它的方式)启动的问题的解决方案。
编辑:
我制作了ComboBox所调用的所有事件的流媒体,并且不会出现任何其他事件会执行您正在查找的事件。 我能想到的唯一解决方案将涉及到挂钩到AutoComplete触发的事件。 难点在于知道这些事件是什么,因为它们似乎没有从我的小测试中显示的那样触发ComboBox
。
仅供参考,这是我曾经想到的最好的解决方案。 显然,这是一个ComboBox子类的Leave事件处理程序。 SelectionChangeCommitted事件不会在鼠标单击时发生,但至少在正常的GUI交互流程中发生。
private void this_Leave (object sender, EventArgs e)
{
// If this is an autocomplete combo-box, select the
// item that was found by autocomplete.
// This seems like something that ComboBox should be
// doing automatically...I wonder why it doesn't?
if (this.AutoCompleteMode != AutoCompleteMode.None)
{
// Determine which combo-box item matches the text.
// Since IndexOf() is case-sensitive, do our own
// search.
int iIndex = -1;
string strText = this.Text;
ComboBox.ObjectCollection lstItems = this.Items;
int iCount = lstItems.Count;
for (int i = 0; i < iCount; ++i)
{
string strItem = lstItems[i].ToString();
if (string.Compare (strText, strItem, true) == 0)
{
iIndex = i;
break;
}
}
// If there's a match, and this isn't already the
// selected item, make it the selected item.
//
// Force a selection-change-committed event, since
// the autocomplete was driven by the user.
if (iIndex >= 0
&& this.SelectedIndex != iIndex)
{
this.SelectedIndex = iIndex;
OnSelectionChangeCommitted (EventArgs.Empty);
}
}
}
如果有人遇到这个问题,我建议一个解决方案对我来说工作正常。
与我一起考虑,接受组合框的建议,通常用户需要使用Enter键进行键入。
你可以写入Combo-box属性的KeyDown事件,如下所示:
private void cboProperty_SelectionChangeCommitted(object sender, EventArgs e)
{
//Call here the event of SelectionChangeCommitted
cboProperty_SelectionChangeCommitted(sender,null);
}
它会在适当的时间提高SelectionChangeCommitted。
链接地址: http://www.djcxy.com/p/11763.html上一篇: ComboBox SelectionChangeCommitted event doesn't work with AutoComplete
下一篇: How to define an enum constant using the underlying value