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