0

ボタンクリックのEventHandlerを設定して、このオブジェクトの他のすべてのハンドラーを置き換えるにはどうすればよいのでしょうか。理想的には、次のようなものになります。

button1.Click = MessageBox.Show("Run just this!"); //Yes, the '=' instead of the '+='.

これは、button1にすでにいくつかのクリックイベントがあり、決定された状況で、他のすべてのイベントを上書きしたいためです。

その他の例:

button1.Click += MessageBox.Show("Event #1 has been triggered!");
button1.Click += MessageBox.Show("Event #2 and #1 have been triggered!");
button1.Click = MessageBox.Show("Event #3, and only #3, has been triggered!");
4

2 に答える 2

1

あなたはこれを試すことができます...

MSDNフォーラムに解決策があります。Click以下のサンプルコードは、からすべてのイベントを削除しますbutton1

ボタンに1つのイベントを保持できます.....

public partial class Form1 : Form
{
        public Form1()
        {
            InitializeComponent();

            button1.Click += button1_Click;
            button1.Click += button1_Click2;
            button2.Click += button2_Click;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello");
        }

        private void button1_Click2(object sender, EventArgs e)
        {
            MessageBox.Show("World");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            RemoveClickEvent(button1);
        }

        private void RemoveClickEvent(Button b)
        {
            FieldInfo f1 = typeof(Control).GetField("EventClick", 
                BindingFlags.Static | BindingFlags.NonPublic);
            object obj = f1.GetValue(b);
            PropertyInfo pi = b.GetType().GetProperty("Events",  
                BindingFlags.NonPublic | BindingFlags.Instance);
            EventHandlerList list = (EventHandlerList)pi.GetValue(b, null);
            list.RemoveHandler(obj, list[obj]);
        }
    }
}
于 2011-11-05T10:13:39.330 に答える
0

設計上、通常、他の発信者の登録を解除することはできません。これは、彼らがあなたの関心事ではないからです。リフレクションを使用してそれをハックすることもできますが、それはほぼ確実にEventHandlerListであるため、重要です。コントロールを分類している場合は、OnClickをオーバーライドしてこれを行うことができますが、それでも...反社会的です。

あなたがこれらすべてを購読しているのであれば、あなたは単に...あなたが実行したくないものを購読しないことができます。

于 2011-11-05T10:10:01.860 に答える