14

WinFormにコマンドボタンがあります。だから、私が次のようなものを持っている場合:

myButton.Click += MyHandler1;
myButton.Click += MyHandler2;
myButton.Click += MyHandler3;

特定のMyHandlerがすでにClickイベントに追加されているかどうかを確認して、コード内の別の場所に再度追加されないようにするにはどうすればよいですか?

自分のイベントの情報にGetInvocationList()を使用する方法を読みました。しかし、さまざまな組み合わせを使用してコマンドボタンのアイテムを取得しようとすると、エラーが発生します。それは言う、

「イベント'System.Windows.Forms.Control.Click'は、+=または-=の左側にのみ表示されます。」

私は何が欠けていますか?

[編集]-アフマドが指摘したこの質問を強調したいと思います。それは応急修理であり、私見の方が簡単なはずですが、うまくいくようです。

4

2 に答える 2

12

ハンドラーが既に追加されているかどうか疑問がある場合は、それを削除して再度追加してください。最初にハンドラーが追加されなかった場合、削除は単に無視されます。

myButton.Click -= MyHandler1;
myButton.Click += MyHandler1;

イベントにアタッチするメソッドを 1 つ作成し、コードが 1 回だけ実行されるようにすることもできます。

private bool handlersAdded;
private void AddHandlers()
{
    if (this.handlersAdded) return;
    myButton.Click += MyHandler1;
    this.handlersAdded = true;
}
于 2010-11-04T07:28:43.407 に答える
3

GetIvocationListの使用は、イベントの所有者(この場合はmyButton)内からのみ実行できます。これは、(デリゲートではなく)イベントの背後にある考え方の1つです。

Slugsterが言ったように、myButtonの外部から呼び出しリストを確認することはできませんが、追加する前にMyHandler#を削除してみることができます。

于 2010-11-04T02:50:04.150 に答える