2013-03-12 38 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()); 

一切都在紅色下劃線稱「方法沒有超載'預覽獎勵'需要1個參數」。我想我不理解lambda是如何工作的,因爲我認爲(發送者,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'方法,而不是讓我創建一個同名的新'私人對象'方法......我徹底困惑了!任何幫助將非常感激!

+0

我有一個「解決方案」,但我真的很想學習這個lambda表達式的東西!所以,我仍然在尋找答案,但是,這裏是我的解決方案: 我創建了一個自定義類並添加了所有想要傳遞的變量: class MyPanel:System.Windows.Controls.Panel { public int id; public string imgString; } 正常使用EventHandler: awardButton.Click + = new EventHandler(PreviewAward); 在我的預覽獎勵方法中: string str =((Panel)sender)。名稱; int id =((Panel)sender).id; string imgStr =((Panel)sender).imgString; – 2013-03-12 16:05:20

+0

糾錯: System.Windows.Controls.Panel = System.Windows.Forms.Panel – 2013-03-12 16:12:36

回答

1

(sender,e)參數不會自動傳遞給您的PreviewAward方法。

它們被傳遞給你的lambda,並且在你的lambda中,你根本就沒有使用它們,並用一個字符串參數手動調用PreviewAward。

有幾種方法可以解決這個問題,但最簡單的方法就是稍微修改一下lambda表達式,以便它將所需參數傳遞給PreviewAward方法。

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

編輯:這就是說,它是一個有點陌生的設計,有需要的額外參數的點擊事件處理程序 - 這意味着該方法的簽名不匹配的事件處理程序的簽名。例如,可能有必要重新考慮一下設計,以便在方法內計算第三個參數。

+0

+1並同意,設計的氣味 – 2013-03-12 16:13:51