16

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

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

4

7 回答 7

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

于 2013-07-19T20:27:44.347 回答
14

You do this the exact same way you'd do it for any C# class. You derive your own class and customize the base class behavior. Every event has a corresponding OnXxxx() method that you can override.

Add a new class to your project and paste this code:

using System;
using System.Windows.Forms;

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

Change the code in OnClick() to do what you want to do. Compile. You'll now have your own button control on the top of the toolbox. And can drop as many copies of it as you want on a form. They'll all behave the same without having to add any code in the form.

于 2013-07-19T20:32:10.680 回答
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;
        }
    }
于 2013-07-19T20:24:01.893 回答
5

您可以通过转换为来获取引发Click事件的按钮。senderButton

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

于 2013-07-19T20:23:06.703 回答
0

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

这个子钩子所有的点击来为按钮着色。

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

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

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

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

于 2013-07-19T22:52:11.047 回答
0

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

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

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

于 2013-07-20T01:42:28.493 回答
0

我以前通常是这样的:

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

此代码将仅运行 button1_Click 下的代码。

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

于 2013-07-22T03:52:29.823 回答