2011-08-13 41 views
1

我寫了一個方法trial的按鈕btnTrial1如何設置動態參數,txtTrial2lblTrial2,然後btnTrial3txtTrial3lblTrial3等等。現在我想爲btnTrial2設置trial作爲EventHandler,然後爲btnTrial3等。在C#方法

所以,現在當我調用該方法trialbtnTrial1,我的參數應該是:

Public void (sender, e, btnTrail1, txtTrial1, lblTrial1) 

但是,當我從btnTrial2調用該方法trial,我的參數應該是:

Public void (sender, e, btnTrail2, txtTrial2, lblTrial2) 

和等等...

+0

您確實應該爲您的事件使用'EventHandler '類型,而不是創建其他代表。你應該創建一個派生自'EventArgs'的類來保存你的參數。 –

+0

正是你讓我對。我試圖將它用作事件處理程序並獲取錯誤對實例方法的委託不能具有null'this'。並抱歉提供有關我的問題的完整信息,但我是編程領域的新手,因此不知道應該提供哪些信息。再次抱歉 – Sandy

回答

3
btnTrial1.YourEvent += (sender, args) => trial(sender, args, 
     btnTrial1, txtTrial1, lblTrial1); 
btnTrial2.YourEvent += (sender, args) => trial(sender, args, 
     btnTrial2, txtTrial2, lblTrial2); 

你提到「生成它們動態」 - 這是沒有問題的,但如果你是在一個循環中,您還需要注意臭名昭着的「捕獲變量/循環」問題 - 值得注意的是,變量「捕獲」必須在循環內;例如:

for(int i = 1 ; i <= 10 ; i++) { 
    var btnTrial = ... 
    var txtTrial = ... 
    var lblTrial = ... 
    btnTrial.YourEvent += (sender, args) => trial(sender, args, 
     btnTrial, txtTrial, lblTrial); 
} 

(如果,例如,btnTrial被宣佈循環,不好的事情會發生)

+0

+1是的,在這種情況下,解決方案應該是簡單的,而不是過於複雜 – sll

0

爲什麼不讓你的試用功能

public void trial(object sender, EventArgs e) 
{ 

} 

,然後根據發件人,使用不同的控制:

public void trial(object sender, EventArgs e) 
{ 
    Button btn; 
    TextBox txt; 
    Label lbl; 

    if (sender == btnTrial1){ 
     btn = btnTrail1; 
     txt = txtTrial1; 
     lbl = lblTrial1; 
    } 

    if (sender == btnTrial2){ 
     btn = btnTrail2; 
     txt = txtTrial2; 
     lbl = lblTrial2; 
    } 

    if (sender == btnTrial3){ 
     btn = btnTrail3; 
     txt = txtTrial3; 
     lbl = lblTrial3; 
    } 

    //rest of the method 
} 
+0

有趣,但有一個問題。在我的應用程序中,用戶可以製作任意數量的控件,因此建議繼續比較值嗎? – Sandy

0

每個按鈕可以添加:

this.button.Click += new System.EventHandler(this.button_Click); 

方法一樣此:

private void button_Click(object sender, EventArgs e) 
{ 
    String name = (sender as Control).Name; 
    int number = Int32.Parse(name.Substring(name.Length-1)); 
    trial(sender, e, this.Controls["btnTrial"+number], this.Controls["txtTrial"+number], Controls["lblTrial"+number]); 
} 
0

兩條建議:

  1. 重構trial()返回一個EventHandler(或理想EventHandler<T>):

    public EventHandler GetTrialEventHandler(Button btn, TextBox txt, Label lbl) 
    { 
        return (sender, args) => 
        { 
         // Do something with btn, txt, lbl 
        }; 
    } 
    
  2. 而不是命名您的表單元素btnTrial1btnTrial2,等等,爲什麼不乾脆讓元素的列表(或一組列表Button + TextBox + Label)?然後你只需要枚舉列表來設置你的事件處理程序,而不是爲每個列表設置硬編碼。

+0

我試過這樣做,但我可以給列表作爲我的事件處理參數 – Sandy

+0

嗨dahlbyk,我用List和它的工作完美。謝謝。 – Sandy