重用datagridview(取消注册事件)

时间:2012-01-15 17:59:56

标签: c# events datagridview

我在我正在处理的项目中将事件处理程序重置为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,事件会被注册两次,依此类推。

有没有人对如何清除事件有任何想法,或者我对我的设计采取了错误的方式?

1 个答案:

答案 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循环以便取消注册。