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(这只是一个标准的处理程序签名)按右边的按钮。通过自定义事件,您可以确保接线正确。