【问题标题】:WinForms SelectedIndexChangeCommitted not firingWinForms SelectedIndexChangeCommitted 未触发
【发布时间】:2020-03-18 18:53:20
【问题描述】:

我正在从数据源填充组合框,并且当用户更改组合框中的选择时,我有代码。所以显然我不希望 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);
}

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

我是否在某处遗漏了什么?我的代码是关闭了还是放错了地方?

【问题讨论】:

  • 您的代码中是否有一个名为cboSelectCategory_SelectedIndexChanged 的方法?
  • @LarsTech - 我添加了事件,在表单加载事件中添加了删除/添加事件的代码,并将其添加到 SelectedIndexChanged 事件中:Console.WriteLine("This shouldn't fire on form load"); 该事件在表单加载时触发了 - 但是没有错误。
  • 也许如果您向我们展示您的代码而不是来自另一个 SO 问题的代码,我们可能会提供更多帮助!
  • @Caius & LarsTech - 对不起,伙计们 - 我不知道我做错了什么/不同,但现在添加 SelectedIndexChanged 事件被阻止在表单加载时触发,因此它可以根据需要工作。是星期一吗??
  • SelectedIndexChangeCommitted(在标题中)是SelectedIndexChangedSelectionChangeCommitted 的奇怪组合。后一个事件仅在您手动更改项目时引发,而在您填写列表并且索引可能设置为-1(您可以订阅前一个事件时总是检查)

标签: c# winforms combobox event-handling


【解决方案1】:

显然我不希望 SelectedIndexChanged 方法中的代码在表单加载时触发。

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

    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");
    }

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

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

【讨论】:

  • 有趣的解决方案。简短,简单和容易。实施的!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多