WinForms SelectedIndexChangeCommitted 未触发

WinForms SelectedIndexChangeCommitted not firing

我正在从数据源填充一个组合框,并且我有用于当用户更改组合框中的选择时的代码。所以显然我不希望 SelectedIndexChanged 方法中的代码在表单加载时触发。

This SO question 通过建议两件事来回答:

1) 在将数据加载到组合框之前和之后使用此代码:

private void LoadYourComboBox()
{
    this.comboBox1.SelectedIndexChanged -= new EventHandler(comboBox1_SelectedIndexChanged);
        // Set your bindings here . . .
    this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);
}

我用这段代码试过了:

this.cboSelectCategory.SelectedIndexChanged -= new EventHandler(cboSelectCategory_SelectedIndexChanged);

但是,cboSelectCategory_SelectedIndexChanged 部分有一个红色波浪形错误,悬停在它上面说:The name cboSelectCategory_SelectedIndexChanged does not exist in the current context。我在 form_load 和实际填充组合框的方法中都尝试了该代码。

2) 同一个 SO 问题的答案是使用事件 SelectedIndexChangeCommitted

private void cboSelectCompany_SelectedIndexChangeCommitted(object sender, EventArgs e)
{
    string selectedCat = cboSelectCategory.SelectedValue.ToString();
    Console.WriteLine(selectedCat);
}

但是当我更改组合框中的选择时,该事件没有触发。

我是不是漏了什么地方?我的代码是关闭还是在错误的地方?

So obviously I don't want the code in the SelectedIndexChanged method to fire on form load.

如果您在表单的构造函数中绑定您的组合框(在 InitializeComponent() 之后),那么 SelectedIndexChanged 将在表单可见之前触发,因此您可以简单地从 selectedindexchanged 事件中 return 如果表单不可见:

    public MainForm()
    {
        InitializeComponent();

        DataTable dt = new DataTable();
        dt.Columns.Add("Name");
        dt.Columns.Add("Code");


        dt.Rows.Add("Milk", "MLK");
        dt.Rows.Add("Bread", "BRD_WHITE");
        dt.Rows.Add("Bread", "BRD_BROWN");
        dt.Rows.Add("Coffee", "COFF");

        comboBox1.DataSource = dt;
        comboBox1.DisplayMember = "Name";
        comboBox1.ValueMember = "Code";

    }


    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (!this.Visible)
            return;

        MessageBox.Show("a");
    }

在不想要的时间简单地从事件处理程序中 return 通常比四处尝试删除和添加事件处理程序更容易

旁注:如果您使用强类型数据集并使用 windows 表单设计器创建绑定,事件不会触发,我相信是因为表单设计器 InitializeComponent() 调用 Begin/EndInit 在开始和结束的组件上