2014-09-20 67 views
0

我想訪問其事件處理程序中的控件參數,而不提及其名稱。來自其事件處理程序的訪問控制

一個例子清楚:

private void label1_Click(object sender, EventArgs e) 
{ 
    self.text="clicked";//pseudo code 
} 

我想財產以後這樣這將改變LABEL1來「點擊」或任何我想要的文字。

我想這樣做是因爲我製作的軟件包含大量標籤和文本框 ,我更喜歡在每個事件處理程序中複製並粘貼單個代碼,而不是爲每個控件輸入單獨的代碼。

這樣的事情可以在C#中完成嗎?我正在使用winforms。

+1

投發件人爲'Label'。你完成了。 – 2014-09-20 13:05:42

回答

6

sender參數(在Windows窗體幾乎所有的事件)實際上是其觸發事件的控制提供參考。

換句話說,你可以簡單地把它轉換爲Control(或Label,或其他):

private void label1_Click(object sender, EventArgs e) 
{ 
     var ctrl = sender as Control; // or (Control)sender 
     ctrl.Text = "clicked"; 
} 

這使您可以將相同的處理方法連接到多個控件的事件,以及使用區分它們在sender參數:

// the `label_Click` method gets called when you click on each of these controls 
label1.Click += label_Click; 
label2.Click += label_Click; 
label3.Click += label_Click; 

另一種方式來做到這一點,如果你想完全避免鑄造,可能是使用lambda來捕獲父控件:

label1.Click += (sender, args) => label1.Text = "Clicked"; 
+2

更快,並顯示所有案例+1 – mybirthname 2014-09-20 13:08:40

0

使用sender說法:

private void label1_Click(object sender, EventArgs e) 
{ 
    Label self = (Label)sender; 
    self.text = "clicked"; //pseudo code 
} 
1

使用發件人的說法:

private void label_Click(object sender, EventArgs e) 
{ 
    Label clickedLabel = sender as Label; 
    if(clickedLabel == null) 
     return; 
    clickedLabel.Text = "clicked"; //pseudo code 
} 

放緩:(

相關問題