2009-12-14 60 views
1

不确定这里到底发生了什么问题。我不确定我是否应该使用“其他如果”或什么。下面的代码:C# - 如果声明有问题?

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字符数来改变。但由于某种原因,它不起作用。我确信解决方案很简单,我只是很容易与整个“其他”事物混淆。提前致谢。

+2

你的意思是“它不工作”?你能否更明确地帮助你? – 2009-12-14 13:49:43

回答

14

这里的问题是如果长度是30,它将匹配每一个if。你应该颠倒顺序,并使用否则,如果为每个语句:

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

非常感谢。 – user 2009-12-14 13:51:45

+2

考虑到每个后续的IF块都会覆盖前一个块的动作,这个变化实际上解决了什么问题? – 2009-12-14 14:04:00

+0

@Lasse V. Karlsen:最初的问题是最终的else子句只与最终的if语句有关,所以上面的if语句总是被覆盖为红色或黑色。 – 2009-12-14 14:24:00

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; 
    } 
+0

错误....想到数字并遵循逻辑... – cjk 2009-12-14 13:51:11

+0

已更改它。现在好了。 :) – 2009-12-14 13:53:18

+0

= 1。嗯。我得到一个“投票太旧,无法更改”的错误消除downvote。我稍后再试... – cjk 2009-12-14 13:55:35

3

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

1

问题是每个你的if陈述是bein摹视为一个单独的语句,所以正在执行的else声明每当最后if说法是错误的,即每当left >= 50

如果在地方的if使用else 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; 
    } 
} 
+1

错误....想到一个数字并测试它。 – cjk 2009-12-14 13:51:43

+0

我现在改变了它。 – Justin 2009-12-14 13:59:51

0

考虑使用else if,即使它看起来丑陋。所有的条件都是真的,如果第一个是真的,所以它会一直到黑色。

1

这是最后一个If条件;除非保留< 50,否则您将始终将标签的前景色恢复为黑色。

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的30步价值,它看起来就像有一个“默认情况下”,你可以处理的消息字符串是如此之大,以至于(140 - messageString.Length)将是< 0.

我也将值#140从颜色选择函数,并使其成为变量或属性,或传递给颜色选择函数的参数,并尝试重新分解代码,以便在代码中可能有很多用途增量中有一个常规模式用于更改访问哪些数据。