当关闭WinForm时,Combox SelectedIndexChanged会触发吗?

4
我正在使用Combobox的SelectedIndexChanged事件执行一些任务。它工作得很好。但是当我关闭表单时,SelectedIndexChanged会触发,然后我会收到“对象引用未设置为对象实例”的异常。我的代码如下-
    private void cmbProductName_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            Product p =(Product) cmbProductName.SelectedItem;

            RawItems = RawItem.GetEntityList(p.Id, ConnectionString);

        }
        catch (Exception ex)
        {
            CustomMessageBox.ShowSystemException(ex);
        }
    }

如何避免在窗体关闭时触发SelectedIndexChanged事件?
谢谢,SKPaul。

有关于在Form Closing事件中设置cmbProductName的内容吗?或者ComboBox会获得焦点。 - andy
在关闭时触发Combobox的SelectedIndexChanged事件不是正常行为,所以请确保在关闭时不要调用它。 - Akrem
@Akerm- 我没有在任何地方调用它。 - s.k.paul
3个回答

8
如果您只想在用户更改组合框中选择的项目时执行任务,最好实现SelectionChangeCommitted事件。
[编辑]
根据MSDN文档,仅当用户通过键盘或鼠标更改ComboBox选择时,才会发生SelectionChangeCommitted事件,并且在程序上更改选择时不会引发此事件。
当列表中的值更改时,首先触发SelectionChangeCommitted事件,然后触发SelectedIndexChanged事件。
因此,如果我们需要在SelectedIndexChanged上执行任何操作,我们可以将其删除并在SelectionChangeCommitted事件处理程序中完成相同的工作。
只需如下处理此事件即可:
private void cmbProductName_SelectionChangeCommitted(object sender, EventArgs e)
{
    /*
      Your event handling code
    */
}

这是个好主意。但我从没用过这种事件。我得先学一下。不过如果你能贴个简单的例子,那就太感激了。 - s.k.paul
谢谢 Khalifa。我怎样才能让你满意?10分满分?哈哈哈。我要修改我的代码了。再次感谢。 - s.k.paul
SelectionChangeCommitted 会导致问题。 - s.k.paul

5
尝试在FormClosing事件处理程序中注销事件:

MyComboBox.SelectedIndexChanged -= combox_SelectedIndexChanged;


2

在关闭窗体时,您可以删除ComboBox事件处理程序。因此,您需要为窗体添加 Closing 事件处理程序,并在其中删除 cmbProductName_SelectedIndexChanged 回调函数。

在这里,您可以阅读有关 Form.Closing如何删除事件处理程序的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接