-2

H,

我有一个事件设置为 ItemChecked 的 listView,现在我需要执行以下操作:

var tmp = this.listView.ItemChecked;
this.listView.ItemChecked = null; //set the event to null

// run some code which checkes some item in the list
// wehre the event shouldnt get fired on

this.listView.ItemChecked = tmp; //set the event again

问题是我无法阅读该事件,我得到的消息是它只能在语句的左侧使用。

有任何想法吗?

4

4 回答 4

1
this.listView.ItemChecked -= myEventHandler;

// run some code

this.listView.ItemChecked += myEventHandler;
于 2012-11-13T13:41:07.243 回答
1

您可以取消订阅并重新订阅以执行您想要执行的操作:

private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e)
{
    listView1.ItemChecked -= new ItemCheckedEventHandler(listView1_ItemChecked);

    // do stuff

    listView1.ItemChecked += new ItemCheckedEventHandler(listView1_ItemChecked);
}
于 2012-11-13T13:41:22.673 回答
1

您可以删除然后添加事件处理程序。假设您的代码位于名为 ItemChecked 的方法中

listView.ItemChecked -= ItemChecked;

// do whatever

listView.ItemChecked += ItemChecked;

但是,我更喜欢检查重入呼叫。

object alreadyInItemChecked;

void ItemChecked(object s, EventArgs e)
{
   if (Monitor.TryEnter(alreadyInItemChecked))
   {
      try
      {
          // do whatever
      }
      finally
      {
          Monitor.Exit(alreadyInItemChecked)
      }
   }
 }
于 2012-11-13T13:53:17.130 回答
0

您可以像这样订阅/取消订阅事件。

        this.someObject.someObjectEvent += someEventHandler;
        this.someObject.someObjectEvent -= null;

因此,当您希望触发事件时订阅并在不需要时取消订阅。

于 2012-11-13T13:44:01.727 回答