C # - Если постановка проблемы? - PullRequest
1 голос
/ 14 декабря 2009

Не уверен, что именно здесь не так. Я не уверен, должен ли я использовать «еще, если» или что. Вот код:

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

Предполагается, что передний цвет метки "вереница символов" будет меняться в зависимости от количества символов в txtMessage. Но по какой-то причине это не работает. Я уверен, что решение простое, я просто легко путаюсь со всем, что еще есть. Заранее спасибо.

Ответы [ 7 ]

14 голосов
/ 14 декабря 2009

Проблема здесь в том, что если длина равна 30, она будет соответствовать каждому if. Вы должны изменить порядок и использовать else, если для каждого утверждения:

if (< 50)      // red
else if (< 80) // orange
...
else           //black
6 голосов
/ 14 декабря 2009

Измените их на:

    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;
    }
3 голосов
/ 14 декабря 2009

Да, вам нужно сделать это в elseif, потому что, как и сейчас, каждое условие является отдельным оператором, что означает, что код будет выполняться вплоть до if(left < 50), а затем он будет либо красным, или черный, так как предложение else будет соответствовать всему, что> 50.

1 голос
/ 14 декабря 2009

Это последнее условие If; если не осталось <50, вы всегда вернете передний цвет метки на черный. </p>

1 голос
/ 14 декабря 2009

Проблема в том, что каждый из ваших операторов if обрабатывается как отдельный оператор, и поэтому ваш оператор else выполняется всякий раз, когда последний оператор 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;
    }
}
0 голосов
/ 14 декабря 2009

Я бы определил список цветов в правильном порядке:

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. </p>

Я бы также вытащил значение # 140 из функции выбора цвета и сделал бы его переменной или свойством, или параметром, переданным в функцию выбора цвета, и попытался бы повторно кодировать код так, чтобы он имелся, возможно, многие из них используются в сценариях, где в приращении использовался обычный шаблон, используемый для изменения данных, к которым осуществляется доступ.

0 голосов
/ 14 декабря 2009

Подумайте об использовании else if, хотя это выглядит уродливее. Все условия верны, если первое верно, поэтому всегда будет черным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...