Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何让按钮做同样的事情?_C#_Winforms_Button - Fatal编程技术网

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

C# 我如何让按钮做同样的事情?,c#,winforms,button,C#,Winforms,Button,我刚开始编程,我想用WinForms制作多个按钮,你可以点击这些按钮,从白色变为灰绿色,再变回白色。我只按了一个按钮: private void button1_Click(object sender, EventArgs e) { if (button1.BackColor != Color.Lime) { button1.BackColor = Color.Lime; } else

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


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

您可以通过将
发送者
强制转换为
按钮
来获得引发
单击
事件的按钮


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

最简单的方法可能是让每个按钮调用相同的单击处理程序。然后在处理程序内部使用发送器而不是硬编码按钮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;
        }
    }

有两种方法。一种可能是创建一个由不同按钮调用的公共函数:

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
),以便知道要更改哪个按钮。传递到handler函数中的
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;
}

因此,首先处理程序获取对调用它的按钮的引用,然后在该按钮上运行逻辑。还请注意,我是如何使处理程序函数的名称更加通用的。现在,您可以转到表单设计器,并将
按钮\u 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()中的代码以执行您想要执行的操作。编译。现在,您将在工具箱顶部拥有自己的按钮控件。并且可以在一张表单上随意放置多份副本。它们的行为都是一样的,不必在表单中添加任何代码。

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

此子项钩住所有单击以为按钮着色

Private Sub ColorButtons(sender As System.Object, e As System.EventArgs) _
Handles Button1.Click, Button2.Click, ..
我总是不小心这样做,因为我拖动/复制一个控件来创建一个新控件,而新按钮被添加到原始控件的事件中

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


不知道如何在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\u单击下运行代码


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

这里还有一个隐含的“使用相同的方法处理所有按钮事件”。您可以在VisualStudio中选择控件的事件处理程序,然后在“属性”窗口中选择“事件”并向下滚动,直到找到“单击”。然后,在“单击”旁边的下拉框中,您可以选择当单击事件发生时要调用的方法,因为您不想简单地退出并剪切和粘贴大量代码。你已经在用正确的方式思考问题了。这正是我想要的。感谢大家的帮助、解释和友好的话语。这在C#中没有什么不同。我不明白为什么这是一种优于使用公共方法或共享事件处理程序的方法。如果按钮真的做了一些有趣的事情,并将在不同的形式中使用,那么这个方法就是正确的选择。否则,这似乎有些过头了。+1它更好,因为它不消耗
单击事件,而只是将行为构建到按钮本身中。此解决方案不涉及事件处理程序,并将代码放在它所属的位置。这是否是过度杀戮是无关紧要的;编写的代码量基本上是相同的,这是一个可重用和可维护的解决方案——future self永远不会问“我在哪里再次编写了这个按钮的行为?”因为,很明显,代码在MyButton类中。如果按钮需要在其他地方重复使用,那么任何其他解决方案都会出现问题。@retailcoder:不,存在过度工程的问题。就是这样。今天请看杰夫·阿特伍德的博客,顺便说一句:。不要浪费时间在过度工程化的重用上,直到你真正需要它,尤其是对于这个显然微不足道的程序。正如另一位评论者所说,它将按钮行为的责任直接放在按钮对象中。这以一种更简洁的方式应用了面向对象的原则,我唯一不喜欢的是我没有想到它。任何将逻辑从处理程序和代码中提取出来并将其放入对象本身的做法都是朝着正确方向迈出的一步。这不是过度设计,而是经过深思熟虑的精心设计。请注意,
RoutedEventHandler
部分是多余的,因为
Click
事件已经指定了它,所以
MyButton1.Click+=按钮\u Click已足够。