单击时更改按钮颜色(多次单击/颜色)

时间:2012-12-19 10:12:45

标签: c# button colors

我正在尝试制作一个8x8按钮的数组,到目前为止它的工作原理。 现在我偶然发现了一个问题。 我希望按钮的颜色(背景色)在单击时更改。再次点击时更改为不同的颜色。

到目前为止,这是我的代码:

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        Button[,] btn = new Button[8,8];

        public Form1()
        {
            InitializeComponent();

            for (int x = 0; x < btn.GetLength(0); x++)
            {
                for (int y = 0; y < btn.GetLength(1); y++)
                {
                    btn[x,y] = new Button();
                    btn[x,y].SetBounds(40 * x, 40 * y, 40, 40);
                    btn[x,y].Click += new EventHandler(this.btnEvent_click);
                    Controls.Add(btn[x, y]);
                    btn[x,y].BackColor = Color.Black;
                }
            }

            /* 
            btn.Click += new EventHandler(this.btnEvent_click);
            btn[x,y].Text = Convert.ToString(x+","+y);
            Controls.Add(btn);
            btn[x,y].Click += new EventHandler(this.btnEvent_click);
            */
        }

        private void form1_load(object sender, EventArgs e)
        {

        }

        void btnEvent_click(object sender, EventArgs e)
        {
           (Control)sender).BackColor = Color.Red;
        }
    }
}

到目前为止,我只能将颜色更改为红色,并且我尝试了多次if和for语句,以便再次更改颜色。

有人可以帮帮我吗?

7 个答案:

答案 0 :(得分:5)

嗨临时你可以使用以下解决方案:

void btnEvent_click(object sender, EventArgs e)
{
    Control ctrl = ((Control)sender);
    switch (ctrl.BackColor.Name)
    {
        case "Red":
            ctrl.BackColor = Color.Yellow;
            break;
        case "Black":
            ctrl.BackColor = Color.White;
            break;
        case "White":
            ctrl.BackColor = Color.Red;
            break;
        case "Yellow":
            ctrl.BackColor = Color.Purple;
            break;
        default:
            ctrl.BackColor = Color.Red;
            break;
    }
}

我知道也可以有更好的解决方案,但同时你也可以使用它......你可以根据需要在开关声明中添加更多颜色

答案 1 :(得分:2)

你可以创建一个新类,从Button继承并在内部处理颜色变化,如下所示:

class TwoColorButton : Button
{
    private int stateCounter = 0;
    private Color[] states = new Color[] { Color.Black, Color.Red };

    public TwoColorButton()
        : base()
    {
        this.BackColor = states[stateCounter];
        this.Click += this.clickHandler;
    }

    protected void clickHandler(object sender, EventArgs e)
    {
        stateCounter = stateCounter == 0 ? 1 : 0;
        this.BackColor = states[stateCounter];
    }
}

答案 2 :(得分:1)

您可以使用Color.FromArgb(int)方法和Random类。见下文:

Random rnd = new Random();

//Alpha set allways 255
Color.FromArgb(255, rnd.Next(255), rnd.Next(255), rnd.Next(255));

//Or Completly random
Color.FromArgb(rnd.Next());

答案 3 :(得分:0)

你尝试过类似的东西吗?

    void btnEvent_click(object sender, EventArgs e)
    { 
       if ((Control)sender).BackColor != Color.Red)
           (Control)sender).BackColor = Color.Red;
       else 
           (Control)sender).BackColor = Color.Green;
    }

答案 4 :(得分:0)

试试吧..它的工作......

在button1点击事件中:

Random randomGen = new Random();
KnownColor[] names = (KnownColor[])Enum.GetValues(typeof(KnownColor));
KnownColor randomColorName = names[randomGen.Next(names.Length)];
Color randomColor = Color.FromKnownColor(randomColorName);
button1.BackColor = randomColor;

答案 5 :(得分:0)

你总是可以创建一个继承按钮类的类,然后为它添加一个计数器,例如它点击的频率,然后在每次点击时加上它,然后根据点击更改颜色

答案 6 :(得分:0)

如果你想通过一组固定的颜色“循环”,你可以尝试这样的事情:

void btnEvent_click(object sender, EventArgs e)
{
    var button = (Button)sender;
    switch(button.BackColor)
    {
        case Color.Black: { button.BackColor= Color.Red;} break;
        case Color.Red: { button.BackColor= Color.Blue;} break;
        case Color.Blue: { button.BackColor= Color.Green;} break;
        // and so on ... don't forget the default clause, just in case
        default: { button.BackColor= Color.Black;} break;
    }
}