重用datagridview(注销事件)

本文关键字:事件 注销 datagridview 重用 | 更新日期: 2023-09-27 18:20:26

在我正在进行的一个项目中,我在将事件处理程序重置为数据网格视图时遇到了一些问题。

我有许多数据网格视图,其中填充了连接到串行端口的测试设备的值。测试会话完成后,我想为新会话重置数据网格视图。

我的问题是,我在创建的每个单元格上都注册了单元格点击事件,当我清除数据网格视图时,该事件会持续存在。

我正在以编程方式设置数据网格视图中的值

以下是我如何添加cellclick事件:

for (int i = 0 ; i < dgList.Count ; i++) //dgList is list of datagridviews
{
    int numberForEvent = i; //i is datagrid nr i
    dgList[i].CellClick += ((sender, e) =>
    {
         alterValueClick(numberForEvent, e.RowIndex);
    });
}

当我第一次使用我的程序时,它工作得很好,但如果我为新的测试会话重置数据网格,事件就会注册两次,以此类推

有人对如何清除事件有什么想法吗?或者我的设计走错了路吗?

重用datagridview(注销事件)

通过重置,我的意思是在数据网格上迭代,并使用.rows.clear和.columns.clear

清除行和列不会取消注册事件。你有两个选项

- either re-initialize DataGrid and re-register the event 
- un-register previous event and re-register new one.

顺便问一下,你为什么需要重置事件?为什么不使用已经注册的事件?

编辑

我认为你不能因为声明点击事件的方式而在这里取消注册。这是一个匿名方法,不会像这个那样取消注册

尝试为事件处理程序分配一个可靠的方法,它应该可以在中工作

//for registering
dgList[i].CellClick += new DataGridViewCellEventHandler(YourMethod);
//for unregistering
dgList[i].CellClick -= new DataGridViewCellEventHandler(YourMethod);

然后,就像在for循环中注册一样,运行一个for循环来取消注册。