C# - 如果声明问题?

时间:2009-12-14 13:46:44

标签: c# if-statement

不确定这里究竟出了什么问题。我不确定我是否应该使用“else if”或者什么。这是代码:

    private void txtMessage_TextChanged(object sender, EventArgs e)
    {
        int length = txtMessage.TextLength;
        int left = 140 - length;
        charactersleft.Text = left.ToString() +  " characters left";

        if (left < 140)
        {
            charactersleft.ForeColor = Color.Green;
        }

        if (left < 110)
        {
            charactersleft.ForeColor = Color.Yellow;
        }

        if (left < 80)
        {
            charactersleft.ForeColor = Color.Orange;
        }

        if (left < 50)
        {
            charactersleft.ForeColor = Color.Red;
        }

        else
        {
            charactersleft.ForeColor = Color.Black;
        }
    }

标签“charactersleft”的前景色应该根据txtMessage中的字符数而改变。但由于某种原因,它不起作用。我确信解决方案很简单,我很容易与整个“别的if”混淆。提前谢谢。

7 个答案:

答案 0 :(得分:14)

这里的问题是如果长度是30,它将匹配每个if。如果对于每个语句,您应该颠倒顺序并使用else:

if (< 50)      // red
else if (< 80) // orange
...
else           //black

答案 1 :(得分:6)

将它们更改为:

    if (left < 50)
    {
        charactersleft.ForeColor = Color.Green;
    }
    else if (left < 80)
    {
        charactersleft.ForeColor = Color.Yellow;
    }
    else if (left < 110)
    {
        charactersleft.ForeColor = Color.Orange;
    }
    else if (left < 140)
    {
        charactersleft.ForeColor = Color.Red;
    }
    else
    {
        charactersleft.ForeColor = Color.Black;
    }

答案 2 :(得分:3)

是的,你需要在elseif中这样做,因为现在,每个条件都是一个单独的语句,这意味着代码将一直执行到if(left < 50)然后它将是红色或黑色,因为else子句将匹配所有&gt; 50。

答案 3 :(得分:1)

问题是你的每个if语句都被视为一个单独的语句,因此只要最后一个else语句为false,就会执行if语句,即每当left >= 50

如果您使用else if代替if,那么这将成为1 if语句,并且只有在以前所有语句均为假时才会执行最终else

您还应该颠倒if语句的顺序,以便首先检查“最不可能”的情况:

private void txtMessage_TextChanged(object sender, EventArgs e)
{
    int length = txtMessage.TextLength;
    int left = 140 - length;
    charactersleft.Text = left.ToString() +  " characters left";

    if (left < 50)
    {
        charactersleft.ForeColor = Color.Red;
    }
    else if (left < 80)
    {
        charactersleft.ForeColor = Color.Orange;
    }
    else if (left < 110)
    {
        charactersleft.ForeColor = Color.Yellow;
    }
    else if (left < 140)
    {
        charactersleft.ForeColor = Color.Green;
    }
    else
    {
        charactersleft.ForeColor = Color.Black;
    }
}

答案 4 :(得分:1)

这是最后的If条件;除非留下&lt; 50,您将始终将标签的前景色还原为黑色。

答案 5 :(得分:0)

考虑使用else if,即使它看起来更丑陋。如果第一个条件为真,那么所有条件都是正确的,所以它总是会变成黑色。

答案 6 :(得分:0)

我会按照正确的顺序定义颜色列表:

private List<Color> clrList = new List<Color> 
{
    Color.Black,
    Color.Orange,
    Color.Yellow,
    Color.Red,
    Color.Green
};

然后编写一个给出长度输入返回正确颜色的函数。

可能看起来像这样:

private Color selectColor(int strLength)
{
    int ndx;

    strLength = 140 - strLength;

    if (strLength < 1)
    {
       // what's the default ndx color to return for strings of length > 140 ?

       if(strLength < 1) ndx = ?? // left for you to complete

    }
    else
    {
       // take advantage of the pattern of increments of #30 to calculate the color index
       ndx = ?? // left for you to complete
    }

    // so now use 'ndx to pull the correct color out of 'clrList
    return clrList[ndx];
}

在这种情况下,您可以在数据“条件”中看到“模式”:您将步长值从50变为140,看起来有一个“默认情况”您可以处理消息字符串的位置是如此之大(140-messageString.Length)将是&lt; 0

我还将颜色选择函数中的值#140拉出来,并将其作为变量或属性,或传递给颜色选择功能的参数,并尝试重新分解代码,使其具有,可能,在用于改变访问哪些数据的增量中有一个常规模式的场景中有很多用途。