如何让按钮做同样的事情?

时间:2013-07-19 20:21:34

标签: c# winforms button

我刚刚开始编程,我想使用WinForms制作多个按钮,你可以点击这些按钮从白色变为石灰绿色再变回白色。我已经为一个按钮做了这个:

private void button1_Click(object sender, EventArgs e)
    {
        if (button1.BackColor != Color.Lime)
        {
            button1.BackColor = Color.Lime;
        }
        else
        {
            button1.BackColor = Color.White;
        }
    }

现在我可以复制并粘贴所有按钮,但我知道效率低;如果我使用winforms引用button2上的button1,它只会改变button1的颜色(显然)。

那么,我是否需要使用辅助方法,新类或其他东西?那会是什么样的?

7 个答案:

答案 0 :(得分:25)

有几种方法。一种可能是创建一个不同按钮调用的通用函数:

private void button1_Click(object sender, EventArgs e)
{
    ChangeColor(button1);
}

private void ChangeColor(Button button)
{
    if (button.BackColor != Color.Lime)
        button.BackColor = Color.Lime;
    else
        button.BackColor = Color.White;
}

然后每个按钮处理程序都可以使用相同的函数调用。

或者,如果所有这些按钮总是做同样的事情,那么你可以为所有按钮使用一个单击处理函数。在这种情况下,您需要做的是确定哪个按钮调用了处理程序(而您当前正在直接引用button1),以便您知道要更改哪个按钮。传递给处理函数的sender对象实际上是对调用处理程序的表单元素的引用。所有你需要做的就是施展它:

private void button_Click(object sender, EventArgs e)
{
    var button = (Button)sender;
    if (button.BackColor != Color.Lime)
        button.BackColor = Color.Lime;
    else
        button.BackColor = Color.White;
}

首先,处理程序获取对调用它的按钮的引用,然后在该按钮上运行逻辑。另请注意我如何使处理函数的名称稍微更通用。现在,您将转到表单设计器并将button_Click设置为应调用此按钮的所有按钮的单击处理程序。

答案 1 :(得分:14)

您执行此操作的完全与您为任何C#类执行此操作的方式相同。您派生自己的类并自定义基类行为。每个事件都有一个相应的OnXxxx()方法,您可以覆盖它。

在项目中添加一个新类并粘贴此代码:

using System;
using System.Windows.Forms;

class MyButton : Button {
    protected override void OnClick(EventArgs e) {
        // Your code here
        //...
        base.OnClick(e);
    }
}

更改OnClick()中的代码以执行您要执行的操作。编译。您现在可以在工具箱顶部拥有自己的按钮控件。并且可以在表单上删除任意数量的副本。它们都表现相同,无需在表单中添加任何代码。

答案 2 :(得分:8)

可能最简单的方法是让每个按钮调用相同的点击处理程序。然后在你的处理程序内部使用Sender而不是硬编码Button1。

private void buttons_Click(object sender, EventArgs e)
    {
        var theButton = (Button) sender;
        if (theButton.BackColor != Color.Lime)
        {
            theButton.BackColor = Color.Lime;
        }
        else
        {
            theButton.BackColor = Color.White;
        }
    }

答案 3 :(得分:5)

您可以通过将Click投放到sender来获取引发Button事件的按钮。

然后,您可以为每个按钮添加相同的处理程序。

答案 4 :(得分:0)

我是一个VB人....在VB.Net中,你可以为事件添加多个处理程序,并将多个事件连接到同一个处理程序。

此子程序会挂钩所有点击以为按钮着色。

Private Sub ColorButtons(sender As System.Object, e As System.EventArgs) _
Handles Button1.Click, Button2.Click, ..

我偶然会这样做,因为我拖动/复制一个控件来创建一个新的按钮,并将新按钮添加到原始事件中。

其他Subs可以处理相同的事件来完成其他工作 - 两者都会执行。

不知道如何在C#中执行此操作。

答案 5 :(得分:0)

执行此操作的正确方法是将每个按钮的单击事件与您为此目的编码的函数相关联(您希望在单击按钮时运行该函数,对吗?),因此添加以下内容(或类似内容) )到代码的适当部分:

MyButton1.Click += new RoutedEventHandler(buttons_Click);
MyButton2.Click += new RoutedEventHandler(buttons_Click);
etc...

您可以根据需要将任意数量的控件关联到事件处理程序。

答案 6 :(得分:0)

我之前通常做的是:

private void button2_Click(object sender, EventArgs e)
{
    button1.PerformClick();
}

此代码只需运行button1_Click下的代码。

但是尽量不要这样练习,只是简单地把它放在一个函数/方法中就像大卫建议的那样。