我在我正在处理的项目中将事件处理程序重置为datagridviews时遇到了一些问题。
我有一些datagridviews,我填充了连接到串口的测试设备的值。 测试会话完成后,我想重置新会话的datagridviews。
我的问题是我已经为每个创建的单元格注册了单元格点击事件,并且当我清除datagridviews时该事件仍然存在。
我正在以编程方式设置datagridview中的值
以下是我添加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);
});
}
我第一次使用我的程序时效果很好但是如果我为新的测试会话重置datagrids,事件会被注册两次,依此类推。
有没有人对如何清除事件有任何想法,或者我对我的设计采取了错误的方式?
答案 0 :(得分:2)
通过重置我的意思是迭代datagrids并使用.rows.clear和.columns.clear
清除行和列不会取消注册事件。你有两个选择
- either re-initialize DataGrid and re-register the event
- un-register previous event and re-register new one.
顺便问一下,为什么需要重置活动?为什么不使用已注册的活动?
修改强>
我认为你不能在这里取消注册click事件,因为你声明它的方式。这是一个匿名方法,它不会像这样注册
尝试为事件处理程序分配一个实体方法,它应该可以工作
//for registering
dgList[i].CellClick += new DataGridViewCellEventHandler(YourMethod);
//for unregistering
dgList[i].CellClick -= new DataGridViewCellEventHandler(YourMethod);
然后就像你在for循环中注册一样,运行for循环以便取消注册。