2014-03-07 56 views
1

我有一個事件處理程序,我想傳遞一些參數到事件方法名稱預計C#

這樣,該行觸發錯誤:方法名預計

p.Click += new System.EventHandler(P_Click(sender, new MyEventArgs { design = reader1["desig_prd"].ToString(), prix = (float)reader1["prix_prd"] })); 

我P_Click事件

public void P_Click(Object sender, EventArgs e) 
    { 
     var args = (MyEventArgs)e; 
     string deignation = args.design; 
     MessageBox.Show(deignation); 
    } 

和我有類MyEventArgs這樣

class MyEventArgs : EventArgs 
{ 
    public string design { get; set; } 
    public float prix { get; set; } 
} 

任何幫助? 在此先感謝

+0

你有從'P_Click'方法的範圍訪問'reader1'? –

回答

3

你不能參數傳遞給你的方法,當你訂閱的事件handler.You應該只是指定方法名稱:

p.Click += new EventHandler(P_Click); 

或短的符號:

p.Click += P_Click; 

如果您想手動觸發並傳遞一些參數,則應該使用該參數調用您的方法:

P_Click(this, new MyEventArgs { design = reader1["desig_prd"].ToString(), 
           prix = (float)reader1["prix_prd"] 
           }); 

但是,這通常是一個不好的做法,(觸發事件處理程序方法手動)。相反使用PerformClick方法訂閱後,您的事件處理程序,當然,創建另一個方法爲你的論點,並呼籲從P_Click該方法:

p.PerformClick(); 
+0

打我吧;) – BradleyDotNET

+0

'p.Click + = P_Click;'不起作用,因爲'P_Click'沒有合適的簽名。他將無法觸發事件,或者在事件處理程序被觸發時向事件處理程序提供不同的參數,因爲他不控制定義/觸發事件的對象的定義,也不能定義類訪問此事件數據提供何時被觸發。 – Servy

+0

如果'p'是一個'button',@Servy是的方法簽名是正確的。你認爲它不是一個按鈕? –

1

更改爲此

p.Click += new System.EventHandler(P_Click); 
+0

這並不能解決他如何在點擊處理程序中訪問所需數據的問題。 – Servy

1

您誤會了事件的工作方式。

p.Click是事件。

P_Click是事件處理程序。

您不發送發件人和事件參數 - 因爲該事件。 所以要掛鉤事件所有你需要的是p.Click += new System.EventHandler(P_Click);或事件只是p.Click += P_Click;

你不需要MyEventArgs(至少不是這種情況),取而代之的,只是在事件本身哈德勒計算這些值:

public void P_Click(Object sender, EventArgs e) 
{ 
    var design = reader1["desig_prd"].ToString(); 
    var prix = (float)reader1["prix_prd"]; 
    ... 
} 
+0

這並不能解決他如何在點擊處理程序中訪問所需數據的問題。 – Servy

+0

這些數據在點擊事件處理程序中可用,但我會編輯它 –

+0

但這就是整個觀點,'reader1'不在事件處理程序的範圍內,只在處理程序被連接的地方。 – Servy

1

使用lambda時可以關上,你想在你的事件處理程序使用的數據:

p.Click += (s, args) => 
    P_Click(reader1["desig_prd"].ToString(), (float)reader1["prix_prd"]);