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

本文关键字:按钮 | 更新日期: 2023-09-27 18:24:03

我刚开始编程,我想使用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的颜色(显然)。

那么,我需要使用一个helper方法、新类还是其他什么?那会是什么样子?

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

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

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设置为所有应该调用它的按钮的单击处理程序。

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

将一个新类添加到您的项目中并粘贴以下代码:

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

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

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

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;
        }
    }

您可以通过将sender强制转换为Button来获得引发Click事件的按钮。

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

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

此子钩挂所有单击以给按钮上色。

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

我总是不小心这样做,因为我拖动/复制一个控件来创建一个新控件,并且新按钮被添加到原来的事件中。

其他Subs可以处理相同的事件来做其他工作——两者都将执行。

不知道如何在C#中做到这一点。

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

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

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

我以前通常做的是:

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

此代码只需运行按钮1_Click下的代码即可。

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