2015-05-16 4 views
0

Имея эту строку:Установка нескольких обработчиков событий в одном операторе

this.button1.Click += this.button2.Click += (s, e) => MessageBox.Show("Test"); 

почему эта линия не работает

Не может неявно преобразовать тип void в System.EventHandler

Нам нужно запасьте еще одну линию, чтобы сделать это? Но представьте себе, если мы получили 20 кнопки для этого

this.button1.Click += this.button(n).Click += MessageBox.Show("Test"); 

Я знаю, что вы скажете:

Вы можете сделать для (каждый) для каждой кнопки и ...

, но что, если мне нужно выбрать, какую кнопку я хочу?

Итак, почему первая строка кода не работает, и делать такие вещи существуют (писал по-разному)

ответ

5

Да, вам нужно отдельно добавить обработчик событий для каждого события, и сообщение об ошибке рассказывая вам, почему именно. В C# this.button2.Click += (s, e) => MessageBox.Show("Test"); не возвращает значение лямбда, поэтому нет ничего, что можно было бы добавить к событию button1.Click.

Это также просто плохой стиль. Я должен был прочитать первую строчку дважды, чтобы понять, что вы пытаетесь сделать. Вы никогда не должны жертвовать ясностью в пользу лаконичности.

+0

Таким образом, мне нужно скопировать и вставить часть строки и изменить имя элемента управления, это некрасиво, но это для ясности – Stickly

+0

я честно изо всех сил, чтобы понять, что это некрасиво о назначении обработчика событий два отдельных события на двух отдельных строках. Они являются логически отличными действиями, которые имеют только совпадающие отношения в том, что они используют один и тот же обработчик событий. На мой взгляд, решение намного уродливее. –

+0

у нас разные умы. В моем, copy-pase = ugly – Stickly

0

Если вы хотите подключить три или более кнопки к одному обработчику событий (встроенный или фиксированный), вам нужно будет поместить их на отдельные строки.

private void Form1_Load(object sender, EventArgs e) 
    { 
     this.button1.Click += new System.EventHandler(this.button1_Click); 
     this.button2.Click += new System.EventHandler(this.button1_Click); 
     this.button3.Click += new System.EventHandler(this.button1_Click); 

     // OR 

     this.button1.Click += (s, a) => ShowMessageBox("Test1"); 
     this.button2.Click += (s, a) => ShowMessageBox("Test2"); 
     this.button3.Click += (s, a) => ShowMessageBox("Test3"); 
    } 

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

    private void ShowMessageBox(string message) 
    { 
     MessageBox.Show(message); 
    } 
+0

спасибо, но это то, чего я не хотел делать, но я думаю, что мне нужно будет это сделать :( – Stickly

+0

Понял. Больше строк кода, но очень читаемо. (Я согласен с @Jason Watkins) –

Смежные вопросы