2013-03-12 2 views
0

Я пытаюсь динамически создать специальный обработчик событий с простыми переданными аргументами. В принципе, у меня есть панель с событием щелчка добавил:Нужна помощь - Динамический клик EventHandler с настраиваемыми аргументами - Выражение Lambda

Panel awardButton = new Panel(); 
awardButton.Click += new EventHandler(PreviewAward); 

Я хочу отправить несколько переменных в моей функции PreviewAward. Я пробовал все, что знаю, но не получал ничего, кроме ошибок. Я пытался искать помощи, и это ближе всего я мог бы найти:

EventHandler with custom arguments

Я попытался с помощью этого кода следующим образом:

awardButton.Click += (sender, e) => PreviewAward(dtAward.Rows[0]["iconImage"].ToString()); 

Все на правой стороне лямбда указывается в красном говоря: «Нет перегрузки для метода« PreviewAward »принимает 1 аргумент». Я думаю, я не понимаю, как работает лямбда, потому что я думал, что (отправитель, e) передается в метод PreviewAward вместе с моей строкой «iconImage», в результате чего всего 3 аргумента, а не один. Кроме того, я попытался добавить переменную в свой метод, но получить ту же ошибку. Вот метод:

private void PreviewAward(object sender, EventArgs e, string slot) 
    { 
     string str = ((Panel)sender).Name; 
     MemoryStream ms = new MemoryStream(Utils.StrToByteArray(str)); 
     MemoryStream preview = new MemoryStream(Utils.ImageMerge(((System.Drawing.Image)(Avatar.Properties.Resources.resizeButtonIn)), Image.FromStream(ms), 200, 200)); 
     Debug.Print("Show Preview for item: " + str); 
    } 

Когда я мыши над функцией на правой стороне лямбды, я получаю немного раскрывающийся на «PreviewAward», который хочет меня создать метод заглушку. Если я нажимаю, что он создает это:

private object PreviewAward(string p) 
    { 
     throw new NotImplementedException(); 
    } 

Я понятия не имею, что делать с этим, особенно в том, что он не имеет мой «отправителя» в нем. У меня создалось впечатление, что он будет использовать метод private void PreviewAward, который я уже создал, вместо того, чтобы создать мне новый метод «private object» с тем же именем ... Я полностью смущен! Любая помощь приветствуется!

+0

У меня есть «решение», но я действительно хочу изучить этот материал выражения лямбда! Итак, я все еще ищу ответ на этот вопрос, но вот мое решение: Я создал пользовательский класс и добавил все переменные, которые хочу передать: класс MyPanel: System.Windows.Controls.Panel { public int id; публичная строка imgString; } Использовать EventHandler как обычно: awardButton.Click + = new EventHandler (PreviewAward); В моем режиме PreviewAward: string str = ((Panel) отправитель).Имя; int id = ((Panel) отправитель) .id; строка imgStr = ((Panel) отправитель) .imgString; –

+0

Исправление: System.Windows.Controls.Panel = System.Windows.Forms.Panel –

ответ

1

Параметры (отправитель, e) не передаются вашему методу PreviewAward автоматически.

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

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

awardButton.Click += (sender, e) => PreviewAward(sender, e, dtAward.Rows[0]["iconImage"].ToString()); 

Edit: Это говорит, что это немного странный дизайн, чтобы иметь обработчик событий щелчка, который требует дополнительного параметра - это означает, что подпись методы не совпадает с подписью EventHandler. Возможно, стоит немного передумать дизайн, чтобы, например, вычислялся третий параметр внутри метода.

+0

+1 и согласитесь, что дизайн запахов –

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