3

此代码立即将文本框更改为红色。我想要它,单击按钮然后是红色,然后是绿色。

private void button1_Click(object sender, EventArgs e)
{

    textBox1.BackColor = System.Drawing.Color.Black;

    if (textBox1.BackColor.Equals(System.Drawing.Color.Black)) 
    {
        textBox1.BackColor = System.Drawing.Color.Red;
    }



    if (textBox1.BackColor.Equals(System.Drawing.Color.Red))
    {
        textBox1.BackColor = System.Drawing.Color.Green;
    }



    if (textBox1.BackColor.Equals(System.Drawing.Color.Green))
    {
        textBox1.BackColor = System.Drawing.Color.Blue;
    }



    if (textBox1.BackColor.Equals(System.Drawing.Color.Blue))
    {
        textBox1.BackColor = System.Drawing.Color.Red;
    }
}
4

5 回答 5

8

一开始您总是将颜色设置为黑色。

最终的逻辑是:

Set the color to black.

Is it black? Yes - change to red.
Is it red? Yes - change to green.
Is it green? Yes - change to blue.
Is it blue? Yes - change to red.

不要那样做。

将初始设置移至类构造函数,并在设置颜色(或使用if/elseif/else构造)后立即从函数返回。

于 2012-11-06T16:11:19.703 回答
6

您想使用else if

if (textBox1.BackColor.Equals(System.Drawing.Color.Black)) 
{
    textBox1.BackColor = System.Drawing.Color.Red;
} 
else if (textBox1.BackColor.Equals(System.Drawing.Color.Red))
{
    textBox1.BackColor = System.Drawing.Color.Green;
} 
else if (textBox1.BackColor.Equals(System.Drawing.Color.Green))
{
    textBox1.BackColor = System.Drawing.Color.Blue;
} 
else if (textBox1.BackColor.Equals(System.Drawing.Color.Blue))
{
    textBox1.BackColor = System.Drawing.Color.Red;
}

您所做的是将其更改为red,然后检查是否是red并将其更改为green. 通过使用else if,您将不会执行if redif it is black

此外,正如蒂姆在评论中指出的那样,如果每次点击都需要删除该行textBox1.BackColor = System.Drawing.Color.Black以停止。在表单的构造函数中将black其设置为。black

于 2012-11-06T16:12:23.380 回答
4

您在第一行将 BackColor 设置为黑色,因此您总是会遇到第一个案例,它会变为红色。

如果你愿意的话,一个 switch 语句可能会让你的代码看起来更好看……

private void button1_Click(object sender, EventArgs e)
{
        switch (textBox1.BackColor.ToKnownColor())
        {
            case KnownColor.Red:
                textBox1.BackColor = Color.Green;
                break;
            case KnownColor.Green:
                textBox1.BackColor = Color.Blue;
                break;
            default:
                textBox1.BackColor = Color.Red;
                break;
        }
}
于 2012-11-06T16:11:48.310 回答
1

您可以创建一个Queue<Color>来确定Color下一个,并在单击按钮时始终切换它。

private Queue<Color> colors = new Queue<Color>();
public Form1()
{
    InitializeComponent();

    //Here you set the order that the colors will be set in.
    colors.Enqueue(System.Drawing.Color.Black);
    colors.Enqueue(System.Drawing.Color.Red);
    colors.Enqueue(System.Drawing.Color.Gray);
    colors.Enqueue(System.Drawing.Color.Blue);
}

private void button1_Click(object sender, EventArgs e)
{
    textbox1.BackColor = colors.Peek();

    //move the color at the front to the back of the queue
    colors.Enqueue(colors.Dequeue());
}
于 2012-11-06T16:13:48.367 回答
0

这是开玩笑的。我测试了这段代码,它可以工作,任何时候都没有推荐给任何人,这只是愚蠢的,因为我们还没有 LINQ 答案,如果需要,我会删除它,但是,这是一个使用内联的示例如果在 LINQ 语句中查找您正在寻找的颜色。我有没有提到这个作品?

        textBox1.BackColor = Color.FromKnownColor(((KnownColor[])Enum.GetValues(typeof(KnownColor)))
            .Where(c => c + (textBox1.BackColor == Color.Red ?
                (int)KnownColor.DarkSlateBlue : textBox1.BackColor == Color.Green ?
                (int)KnownColor.Chartreuse : (int)textBox1.BackColor.ToKnownColor() - (int)KnownColor.Red)
                == textBox1.BackColor.ToKnownColor())
                .FirstOrDefault());
于 2012-11-06T21:06:05.177 回答