2014-07-21 120 views
1

我有一個自定義按鈕的矩陣(我繼承了Button類的FifteenButton)。我想爲矩陣中的每個按鈕都有一個單擊事件,它調用一個可以完成某些工作的方法。但我不想爲矩​​陣中的每個按鈕編寫這種方法。所以,我做了這樣的事情在initializeComponentClick event to a custom button

for (int i = 0; i < 4; i++) 
    for (int j = 0; j < 4; j++) 
     fbarr[i, j].Click += new System.EventHandler(this.FifteenButton_Click); 

FifteenButton_Click我想知道哪個按鈕被點擊(最好是I,J座標)。

我應該如何去做這樣的事情?可能在EventArgs FifteenButton_Click?但我不知道該怎麼做。

+0

第一個參數是一個'Control'參考發件人。 –

+0

@AndrewBarber謝謝,如果你想你可以回答,我會選擇你作爲正確的答案。 – shoham

回答

2

Click事件的事件哈德勒接收兩個參數

void FifteenButton_Click(object sender, EventArgs e) 

sender參數是參照按鈕點擊,

void FifteenButton_Click(object sender, EventArgs e) 
{ 
    Button btn = sender as Button; 
    if(btn != null) 
    { 
      Console.WriteLine("Button clicked: " + btn.Text); 
    } 
} 

然而,如果你想要檢索的位置在你的問題中使用的數組中的按鈕,你需要更多的東西。例如,您可以使用Tag屬性來存儲按鈕的i j座標。

for(int i = 0; i < 4; i++) 
{ 
    for (int j = 0; j < 4; j++) 
    { 
     fbarr[i, j].Click += new System.EventHandler(this.FifteenButton_Click); 
     fbarr[i, j].Tag = i.ToString() + "_" + j.ToString(); 
    } 
} 

現在,在事件處理程序,culd輕鬆讀取按鈕的Tag屬性和恢復索引

void FifteenButton_Click(object sender, EventArgs e) 
{ 
    Button btn = sender as Button; 
    if(btn != null) 
    { 
      string[] xy = btn.Tag.ToString().Split('_'); 
      Console.WriteLine("Button clicked: " + xy[0] + "," + xy[1]); 
    } 
} 
+0

謝謝,但爲什麼你檢查'btn'是否爲空?只有15Button可以調用這個方法,所以它當然會是15Button,爲什麼要檢查? – shoham

+0

嗯,這是真的,用as關鍵字轉換後的習慣力量。說實話,如果我檢查null,我應該檢查標籤屬性。 – Steve