在任何按钮中单击的事件(C#窗体)

Kil*_*oku 4 c# visual-studio-2010 windows-forms-designer

我正在开发一个程序,它有许多按钮,点击时应该执行类似的操作,但根据点击的按钮有很小的差异.问题是唯一直接的路径是为每个按钮编写代码,这将是一个非常重复的任务.有没有办法只编程一个块,可以点击任何按钮,单击哪个按钮?

Ada*_*dam 12

为所有按钮分配相同的事件处理程序.

foreach (var button in Controls.OfType<Button>()) {
    button.Click += button_Click;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以在切换到事件的属性窗口中选择相同的事件处理程序(闪存图标).


private static void button_Click(object sender, EventArgs eventArgs)
{
    switch (((Button)sender).Name)
    {
        // find a way to disambiguate.
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以向Tag属性添加一些有用的信息以消除歧义.最后但并非最不重要的是,您可以从中派生自己的按钮Button并添加适当的属性.它们甚至会出现在属性窗口中.


Oli*_*bes 7

通过双击其中一个按钮创建一个按钮单击处理程序.但是不要对其他按钮执行相同操作,请转到属性窗口并切换到事件视图.现在依次选择其余每个按钮,并从Click属性窗口中其他按钮事件的下拉列表中选择刚创建的单击处理程序.现在,当点击它们时,它们都会触发相同的方法.

在此输入图像描述

private void button1_Click(object sender, EventArgs e)
{
    var btn = (Button)sender;
    switch (btn.Name) {
        case "button1":
            ...
            break;
        case "button2":
            ...
            break;
        case "button3":
            ...
            break;
        default:
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以Tag在属性窗口中为按钮的属性定义值,并直接使用它,而无需使用switch-或if-语句.

您也可以直接测试特定按钮sender == button1,但这在switch语句中不起作用.


创建自己的按钮Button并从中添加所需的属性可能更容易.编译完成后,您的按钮将显示在"工具箱"中,您的属性可以在属性窗口中设置.

public class MyButton : Button
{
    public int A { get; set; }
    public int B { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

用法:

private void button1_Click(object sender, EventArgs e)
{
    var btn = (MyButton)sender;
    DoSomething(btn.A, btn.B);
}
Run Code Online (Sandbox Code Playgroud)