C# 在单击事件中识别发送者按钮控件

C# 在单击事件中识别发送者按钮控件,c#,winforms,custom-controls,C#,Winforms,Custom Controls,我制作了一个自定义按钮,它有一个名为Data的字段 我在运行时以编程方式将此按钮添加到winform中,并在添加时为它们定义一个单击事件。嗯,实际上我只有一个方法,我订阅了这个方法的新添加的按钮 但在单击事件中,我想访问此数据字段并将其显示为消息框,但我的选择似乎不正确: CustomButton_Click(object sender, EventArgs e) { Button button; if (sender is Button)

我制作了一个自定义按钮,它有一个名为
Data
的字段

我在运行时以编程方式将此按钮添加到winform中,并在添加时为它们定义一个单击事件。嗯,实际上我只有一个方法,我订阅了这个方法的新添加的按钮

但在单击事件中,我想访问此
数据
字段并将其显示为消息框,但我的选择似乎不正确:

    CustomButton_Click(object sender, EventArgs e)
    {
        Button button;
        if (sender is Button)
        {
            button = sender as Button;
        } 

        //How to access "Data" field in the sender button? 
        //button.Data  is not compiling!
    }
更新:


很抱歉,我用“未编译”声明,
.Data
不会显示在intelisense中…

您需要强制转换为具有数据字段的自定义类的类型

比如:

YourCustomButton button = sender as YourCustomButton;

假设自定义按钮类型为
CustomButton
,则应改为:

CustomButton_Click(object sender, EventArgs e){
  CustomButton button = sender as CustomButton;
  if (button != null){
      // Use your button here
  } 
}

如果不想设置变量,简单的方法是:

((CustomButton)sender).Click

或者任何你想要的

您不必检查
sender
是否是
按钮
,因为
as
关键字可以确保您的变量为
null
,如果它无法将您的变量转换为正确的类。这不是有效的C代码,因此它当然不起作用。一般来说,自定义按钮控件应该覆盖OnClick方法,这样它就可以实现自己的自定义单击事件行为。您是如何尝试访问“数据”字段的?它只是没有出现在IntelSense中……现在我将它转换为
CustomButton
它有了。@HansPassant我明白了,谢谢您指出它@Sean87此答案解决了无法访问数据字段的问题,但更好的长期方法是遵循Hans的注释并覆盖OnClick,或者可能引入自定义事件以使事情更加类型安全-您目前依赖于连接customhandler(这只是一个标准的处理程序签名)按右边的按钮。通过自定义事件,您可以确保接线正确。