5

我正在开发一个程序,该程序具有许多按钮,当单击时应该执行类似的操作,但根据单击的按钮略有不同。问题是唯一直接的方法是为每个按钮编写代码,这将是一项非常重复的任务。有没有一种方法可以简单地编写一个块来单击任何按钮以及单击哪个按钮?

4

4 回答 4

14

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

foreach (var button in Controls.OfType<Button>()) {
    button.Click += button_Click;
}

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


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

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

于 2012-09-23T17:13:39.233 回答
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;
    }
}

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

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


创建您自己的派生按钮Button并添加所需的属性可能会更容易。编译后,您的按钮将出现在工具箱中,您的属性可以在属性窗口中设置。

public class MyButton : Button
{
    public int A { get; set; }
    public int B { get; set; }
}

用法:

private void button1_Click(object sender, EventArgs e)
{
    var btn = (MyButton)sender;
    DoSomething(btn.A, btn.B);
}
于 2012-09-23T17:21:44.153 回答
3

有没有一种方法可以简单地编写一个块来单击任何按钮以及单击哪个按钮?

我只会使用相同的点击事件并有条件地检查点击了哪个按钮的发件人

private void button1_Click(object sender, System.EventArgs e)
{
   if(sender == button1)
   {
      //do something different for button1
   }
   else if(sender == button2)
   {
      ....
   }
}

或者一个switch语句..

于 2012-09-23T17:21:46.793 回答
1

是的,您可以只创建一个按钮单击事件处理程序,并使用 Visual Studio Designer 将其与所有按钮连接起来。

这很简单,只需按照以下步骤操作:

1) 通过双击任一按钮为任一按钮创建 btn_click 事件处理程序。2) 对于所有其他按钮,右键单击任何按钮,单击属性,转到事件,在“单击”事件上,从下拉列表中选择 btn_click。

如果您希望同一事件处理程序中的不同按钮具有不同的功能,您可以将 sender 参数向下转换为 Button 类型,然后使用其 Name 属性来区分按钮。

这是一个例子:

private void btn_Click(object sender, System.EventArgs e)
{
   Button b =(Button)sender;
   if(b.Name == "button1")
   {
      //some code
   }
   else if(b.Name == "button2")
   {
      ....
   }
}
于 2012-09-23T17:32:11.523 回答