C# 此代码立即将文本框更改为红色。我想要它像,点击按钮,然后红色,再然后绿色
此代码立即将文本框更改为红色。我希望它像,点击按钮,然后红色,再次,然后绿色C# 此代码立即将文本框更改为红色。我想要它像,点击按钮,然后红色,再然后绿色,c#,button,if-statement,C#,Button,If Statement,此代码立即将文本框更改为红色。我希望它像,点击按钮,然后红色,再次,然后绿色 private void button1_Click(object sender, EventArgs e) { textBox1.BackColor = System.Drawing.Color.Black; if (textBox1.BackColor.Equals(System.Drawing.Color.Black)) { textBox1.BackColor =
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;
}
}
首先,始终将颜色设置为黑色 最终的逻辑是:
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构造后立即从函数返回。您在第一行将背景色设置为黑色,因此您将始终使用第一个大小写,它将变为红色 如果您愿意,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;
}
}
如果出现以下情况,则要使用else:
您所做的是将其更改为红色,然后检查它是否为红色并将其更改为绿色。如果不执行if-red,则使用else
此外,正如Tim在评论中指出的那样,如果每次单击都显示为黑色,则需要删除textBox1.BackColor=System.Drawing.Color.Black行以停止。在窗体的构造函数中将其设置为黑色。您可以创建一个队列来确定下一个颜色,并在单击按钮时始终切换该颜色
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());
}
这是开玩笑的。我测试了这段代码,它是有效的,任何时候都不推荐给任何人,这只是为了搞笑,因为我们还没有LINQ答案,如果需要,我会删除它,但是,下面是一个在LINQ语句中使用内联if来查找您要查找的颜色的示例。我提到过这个作品吗
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());
是的,因为否则代码不会运行。当它是黑色时,它会显示颜色=red@user1803685-但你每次点击按钮都会这样做。您应该在构造函数中初始化它。按照你的方式,颜色永远不会循环。好吧,我该怎么解决这个问题?它需要一个中断或其他东西。@user1803685:使用Visual Studio中的“属性”窗格将初始文本框颜色设置为黑色。您不需要第一行将其设置为黑色,即使在构造函数中也不需要。正如Dave Shaw所指出的,你需要其他的if's。到目前为止,你的答案是最有用的,但正如其他人所指出的,最初将颜色设置为黑色只会导致触发第一个条件。这在当前状态下没有帮助,因为第一行仍然使其余的毫无意义。@TimSchmelter我认为我没有复制那行-doh-我现在将其删除,并澄清我的答案。@user1803685:第一次单击时。再次单击。@user1803685请看我刚刚编辑的最后一段,Tim对它的评论总是黑色的。只有在堆栈溢出时,才能使用六种不同的方法来更改文本框的颜色。这里唯一缺少的是Linq版本。@RobertHarvey和,除了Erby的回答外,他们都表现出不好的练习/没有抓住要点。@RobertHarvey补充了Linq版本。虽然不是最好的,但经过测试,效果良好。只是开个玩笑…@user1803685不起作用是毫无意义的。怎么搞的?您是否遇到错误,是运行时错误还是编译时错误?错误是什么?是否发生了不希望发生的事情,如果是,是什么?您是否做了任何更改,如果有,是什么?已测试。现在工作。对不起,我使用的是非常量输入开关。然而,对于这种情况,有一个很好的KnownColor枚举,如果您使用KnownColor,那么红色、绿色和蓝色是非常有名的。
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());