C# Visual Studio窗体应用程序中的按钮

C# Visual Studio窗体应用程序中的按钮,c#,winforms,button,C#,Winforms,Button,很抱歉,如果这是一个愚蠢的问题,我正在学习编程课程的介绍,需要对我正在进行的项目提供一些帮助 我正在尝试编写一个有大约30个按钮的应用程序。我希望所有按钮在单击时都变成黄色。如果再次单击它们,它们将变回默认颜色。现在我使用的代码是: private void btn_1_Click(object sender, EventArgs e) { btn_1.BackColor = Color.Yellow; } 但这只会使按钮变黄,我无法通过再次单击按钮来“关闭”按钮 另外,当我在VS20

很抱歉,如果这是一个愚蠢的问题,我正在学习编程课程的介绍,需要对我正在进行的项目提供一些帮助

我正在尝试编写一个有大约30个按钮的应用程序。我希望所有按钮在单击时都变成黄色。如果再次单击它们,它们将变回默认颜色。现在我使用的代码是:

private void btn_1_Click(object sender, EventArgs e)
{
    btn_1.BackColor = Color.Yellow;
}
但这只会使按钮变黄,我无法通过再次单击按钮来“关闭”按钮

另外,当我在VS2010中创建这些按钮事件时,每个按钮都有30个不同的事件处理程序。有没有办法让它们都做同样的事情,而不必编写所有重复的代码

我猜我必须写我自己的按钮类?我该怎么做呢?我是否需要创建一个继承按钮的类库


对不起,我没有回答你的问题。谢谢

如果每个按钮都有需要执行的特定操作,那么是的,每个按钮都需要一个单击处理程序;但是,您可以将常见行为封装在单个方法中

例如:

private void btn_1_Click(object sender, EventArgs e)
{
    ToggleColor((Button)sender);
    //rest of the code specific to this button
}

private void ToggleColor (Button button)
{
     if(button.Color==Color.Yellow;
         button.Color=Color.Black;
     else 
         button.Color=Color.Yellow;
}
public bool IsButtonYellow;
private void btn_1_Click(object sender, EventArgs e) {
    if(!IsButtonYellow) {
    btn.BackColor = Color.Yellow;
    IsButtonYellow = true;
    }
    else {
    btn.BackColor = Control.DefaultBackColor;
    IsButtonYellow = false;
    }
}
注意,上面的代码没有经过测试

现在,如果所有按钮都执行相同的操作,您可以将所有按钮的点击处理程序设置为
btn_1_click
;比如说

private void btn_1_Click(object sender, EventArgs e)
{
    if (btn_1.BackColor != Color.Yellow)
    {
        btn_1.BackColor = Color.Yellow
    }
    else
    {
        btn_1.BackColor = Color.Control;
    }
}

这是切换默认值和黄色

如果所有按钮都执行完全相同的操作,则可以将相同的事件处理程序分配给所有按钮(而不是btn_1_单击、btn_2_单击等…您将有btton_单击)-您可以在每个按钮的属性中选择此处理程序。

您不必编写自己的类。您只需将所有按钮分配给同一个事件处理程序,如下所示:

button1.Click += new EventHandler(myEventHandler);
button2.Click += new EventHandler(myEventHandler);
button3.Click += new EventHandler(myEventHandler);
button4.Click += new EventHandler(myEventHandler);
请记住,事件处理程序具有以下签名:

private void myEventHandler(object sender, EventArgs e)
这样,单击所有按钮时,将触发相同的方法

现在要控制颜色,您可以在窗体上创建一个简单的属性,该属性将保存最后应用的颜色。它可以是一个枚举,然后您只需检查它的值并将另一个应用于按钮,如下所示:

// Declare your enum:
private enum Colors { Yellow, Default }

private Colors ActualColor = Colors.Default;


// Write your custom event handler:
private void myEventHandler(object sender, EventArgs e)
{
    if (ActualColor == Colors.Default)
    {
        // Apply yellow to buttons
        ActualColor = Colors.Yellow;
    }
    else
    {
        // Apply default
        ActualColor = Colors.Default;
    }            
}
public class MyButton : Button
{
    private bool _buttonState;

    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);

        if (_buttonState)
        {
            BackColor = Color.Yellow;
        }
        else
        {
            BackColor = Color.White;
        }
    }
}

为了跟踪是否是“第二次”按下按钮,应该在方法外声明一个变量,该变量指示是否已按下按钮

例如:

private void btn_1_Click(object sender, EventArgs e)
{
    ToggleColor((Button)sender);
    //rest of the code specific to this button
}

private void ToggleColor (Button button)
{
     if(button.Color==Color.Yellow;
         button.Color=Color.Black;
     else 
         button.Color=Color.Yellow;
}
public bool IsButtonYellow;
private void btn_1_Click(object sender, EventArgs e) {
    if(!IsButtonYellow) {
    btn.BackColor = Color.Yellow;
    IsButtonYellow = true;
    }
    else {
    btn.BackColor = Control.DefaultBackColor;
    IsButtonYellow = false;
    }
}
是的:

  • 创建自己的按钮类
  • 从按钮继承
  • 在button类中实现处理程序,就完成了
  • 您可以这样做:

    // Declare your enum:
    private enum Colors { Yellow, Default }
    
    private Colors ActualColor = Colors.Default;
    
    
    // Write your custom event handler:
    private void myEventHandler(object sender, EventArgs e)
    {
        if (ActualColor == Colors.Default)
        {
            // Apply yellow to buttons
            ActualColor = Colors.Yellow;
        }
        else
        {
            // Apply default
            ActualColor = Colors.Default;
        }            
    }
    
    public class MyButton : Button
    {
        private bool _buttonState;
    
        protected override void OnClick(EventArgs e)
        {
            base.OnClick(e);
    
            if (_buttonState)
            {
                BackColor = Color.Yellow;
            }
            else
            {
                BackColor = Color.White;
            }
        }
    }
    

    然后在代码中,您可以根据需要创建任意数量的“MyButton”对象,而无需重复代码。

    要使所有按钮在VS2010中使用相同的事件处理程序,请执行以下操作:

    单击一次按钮将其选中

    在“属性”窗口中:单击“闪电”(=事件)

    将第一个按钮的事件名称(
    btn\u 1\u单击
    )粘贴到“单击”旁边

    对每个按钮都执行相同的操作

    至于改变颜色: 参见killie01的答案

    祝你好运