-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

イベントハンドラーを削除してから追加できます。コードが 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 に答える
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 に答える
0

このようにイベントの購読/購読解除を行うことができます。

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

したがって、イベントを発生させたい場合はサブスクライブし、不要な場合はサブスクライブを解除します。

于 2012-11-13T13:44:01.727 に答える