フォームの読み込み中に再帰関数を使用しています。プログラムでコントロールにイベント ハンドラーをアタッチしています。再帰関数により、イベント ハンドラーはコントロールに複数回フックされます。これらのコントロールからすべてのハンドラーを削除したいと考えています。
例えば。テキストボックスにkeypress、keydown、gotfocusなどのイベントを追加しました。これらのハンドラをすべて削除したい。どのようにそれを達成するのですか?
loEventHandler
が以前にイベント (たとえば、クリック) をサブスクライブしたイベント ハンドラーである場合は、 を実行して削除できますloBox.Click -= loEventHandler;
。
イベントを null に設定することで、プライベート スコープ内でイベントをクリアすることもできますが、MyEvent = null;
これはパブリック スコープでは機能しません。
1 つのイベントが複数回登録されるのを避けるために、次のようなプロパティ ラッパーを追加できます。
public event EventHandler<EventArgs> _event;
public event EventHandler<EventArgs> PublicEvent
{
add
{
if (_event == null)
_event += value;
}
remove
{
_event -= value;
}
}
イベントは特別な種類のデリゲートであり、サブスクライバーが互いに干渉することを許可しないため、「外部」の世界からそれを行うことはできません。