3

我在 for 循环中使用了以下代码片段

DataTable childTable = dataTable.DataSet.Relations[relationName].ChildTable;

if (childTable != null)
{
   iBindingList = childTable.AsDataView() as IBindingList;
   iBindingList.ListChanged += new ListChangedEventHandler(GridDataRecord_ListChanged);
}

在这种情况下,我需要检查是否已为 iBindinglist 对象调用了 listchanged 事件。您能否对此进行调查并提供建议以实现此目的。感谢Advance。

问候, 拉贾塞卡

4

2 回答 2

5

无法查看您的处理程序是否已添加。幸运的是,您不需要这样做。

iBindingList.ListChanged -= GridDataRecord_ListChanged;
iBindingList.ListChanged += GridDataRecord_ListChanged;

假设一个行为良好的类(在这种情况下,您应该能够相信该类行为良好),GridDataRecord_ListChanged即使它没有被添加,您也可以安全地删除它。删除它只会什么都不做。如果您只在删除处理程序后添加处理程序,则永远不会多次添加它。

于 2013-08-07T20:18:49.397 回答
1

您可以在附加之前删除处理程序

if (childTable != null)
{
   iBindingList = childTable.AsDataView() as IBindingList;
   iBindingList.ListChanged -= new ListChangedEventHandler(GridDataRecord_ListChanged);
   iBindingList.ListChanged += new ListChangedEventHandler(GridDataRecord_ListChanged);
}

如果您正在运行单线程环境并且一直像这样附加此事件,那么它应该没问题。但是,如果有多个线程,则可能存在竞争条件。正如评论中提到的,如果您有多个线程附加同一个委托,这是一个问题。-=仅删除最后一个委托,因此多次添加和一次删除将意味着该事件仍处于附加状态。

或者,有一个标志来检查事件是否已被订阅。

bool listChangedSubscribed = false;  
if (childTable != null)
{
   iBindingList = childTable.AsDataView() as IBindingList;
   iBindingList.ListChanged -= new ListChangedEventHandler(GridDataRecord_ListChanged);
   if(!listChangedSubscribed)
   {
       iBindingList.ListChanged += new ListChangedEventHandler(GridDataRecord_ListChanged);
       listChangedSubscribed = true; 
   }
于 2013-08-07T20:20:16.567 回答