如何将控件事件设置为null

时间:2012-11-13 13:37:18

标签: c# visual-studio events

H,

我有一个listView,事件设置为ItemChecked,现在我需要做类似的事情:

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 个答案:

答案 0 :(得分:1)

this.listView.ItemChecked -= myEventHandler;

// run some code

this.listView.ItemChecked += myEventHandler;

答案 1 :(得分:1)

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

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

    // do stuff

    listView1.ItemChecked += new ItemCheckedEventHandler(listView1_ItemChecked);
}

答案 2 :(得分: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)
      }
   }
 }

答案 3 :(得分:0)

您可以按照这样的方式订阅/取消订阅活动。

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

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