c# - ComboBox SelectionChangeCommitted 事件不适用于自动完成

标签 c# winforms autocomplete combobox

这是一个重现我刚刚遇到的问题的小程序。这是在带有 .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 没有被调用!我修改后的答案如下。

最佳答案

Using the SelectedIndexChanged event is not an option, because for the application behind this canned example, I only want it to happen when the user makes a selection, not when it's set programmatically.

您还可以通过编写一个包装器方法来更改暂时禁用您的事件的选择来完成此操作。

不幸的是,对于更一般的情况(例如您不控制 ComboBox或访问方式)。

编辑:

我制作了 ComboBox 调用的所有事件的流媒体,但似乎没有任何其他事件可以满足您的需求。我能想到的唯一解决方案是 Hook 到自动完成触发的事件中。困难在于知道这些事件是什么,因为从我的小测试显示,它们似乎不会触发 ComboBox

关于c# - ComboBox SelectionChangeCommitted 事件不适用于自动完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14488659/

相关文章:

c# - 任何人都知道有关 Fluent Nhibernate 1.1 存储过程的任何体面资源

c# - 按值或引用返回?

c# - 在生成的邮件中添加默认的outlook签名

Jquery ui 自动完成用 ID 填充隐藏字段

c# - DisplayAttribute 名称属性在 Silverlight 中不起作用

c# - 从并发字典中获取所有值并在不丢失数据的情况下清除它

c# - 如何使用 GraphicsPath 绘制形状来创建自定义控件的区域?

vb.net - 单击时动态更改笔的颜色和绘画

c# - 自动完成案例问题

jquery 自动完成功能无法与 django 一起正常工作