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

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

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

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

 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而不是硬编码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; } } 

您可以通过将senderButton来获取引发Click事件的Button

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

我是一个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(); } 

这段代码只需运行button1_Click下的代码即可。

但是尽量不要这样练习,只需将其放入函数/方法中,就像大卫建议的那样。