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

use*_*871 16 c# button winforms

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

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

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

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

Dav*_*vid 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;
}
Run Code Online (Sandbox Code Playgroud)

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

或者,如果所有这些按钮总是完全相同,那么您可以为所有按钮使用一个单击处理函数.在这种情况下,您需要做的是确定哪个按钮调用了处理程序(而您当前正在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;
}
Run Code Online (Sandbox Code Playgroud)

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


Han*_*ant 14

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

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

using System;
using System.Windows.Forms;

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

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

  • 除了过度工程的争论之外,我真的很喜欢这种方法的优雅.正如另一位评论者所说,它将按钮行为的责任完全放在按钮对象中.这以更清洁的方式应用面向对象的原则,我唯一不喜欢的是我没有想到它.任何将逻辑排除在世界的处理程序和代码隐藏之外并将其放入对象本身的东西都是朝着正确方向迈出的一步.这不是过度设计,这是精心设计的. (5认同)

Bil*_*egg 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)


SLa*_*aks 5

您可以Click通过强制转换sender来获取引发事件的按钮Button.

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

  • 这里有一个隐含的"让同一个方法处理所有按钮事件".您可以通过选择控件在visual studio中选择控件的事件处理程序,然后在属性窗口中选择"事件"并向下滚动直到找到"单击".然后在"单击"旁边的下拉框中,您可以选择在单击事件发生时要调用的方法 (2认同)