2014-09-20 70 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 
} 

放缓:(

相关问题