从其事件处理程序访问控件

Sur*_*wal 2 c# winforms

我想在它的事件处理程序中访问控件的参数而不提及它的名字.

一个例子清楚地表明:

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

我想要像这样的东西,将label1的文本改为"点击"或我想要的任何东西.

我想这样做是因为我正在制作的软件包含大量标签和文本框,我更喜欢在每个事件处理程序中复制并粘贴单个代码,而不是为每个控件键入单独的代码.

可以在C#中完成这样的事情吗?我正在使用winforms.

Gro*_*roo 8

sender参数(在Windows窗体中的几乎所有事件中)实际上是对触发事件的控件的引用.

换句话说,您可以简单地将其转换为Control(或者Label或其他):

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

这允许您将相同的处理程序方法附加到多个控件上的事件,并使用以下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;
Run Code Online (Sandbox Code Playgroud)

另一种方法是,如果你想完全避免强制转换,可能是使用lambda来捕获父控件:

label1.Click += (sender, args) => label1.Text = "Clicked";
Run Code Online (Sandbox Code Playgroud)