C # A ButtonClick действие, чтобы заменить все остальные? - PullRequest
0 голосов
/ 05 ноября 2011

Мне было интересно, как я могу установить 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!");

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Вы можете попробовать это ...

На форумах MSDN есть решение.Пример кода ниже удалит все Click события из button1.

, вы можете сохранить одно событие на кнопке .....

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]);
        }
    }
}
0 голосов
/ 05 ноября 2011

По умолчанию вы не можете отписаться от других абонентов.Это потому, что они не являются вашей заботой .Вы можете использовать отражение, чтобы взломать его, но это почти наверняка EventHandlerList, настолько нетривиальный.Если вы используете классификацию элемента управления, вы можете переопределить OnClick, чтобы сделать это, но это все равно кажется ... антисоциальным.

Если вы подписываетесь на все это, вы можете просто ... не подписываться на то, чтоне хочу бежать.

...