hiioo Ответов: 3

Этикетка не меняется


 I wrote a code in c# windows form application contain many if statement when I run project and enter data the label should change its color according to the if clause, but the color is still as in the last label  


Что я уже пробовал:

private void button1_Click(object sender, EventArgs e)
        {
            double height, weight;
            double BMI = 0;
            height = Convert.ToDouble(textBox1.Text);
            weight = Convert.ToDouble(textBox2.Text);


            BMI = weight / (height * height);
            if (BMI < 18.5)
            {
                label3.Text = Convert.ToString("Under Weight");
                label3.ForeColor = Color.Blue; }

            else if
                ((BMI > 18.5) && (BMI < 24.9))
            {    label3.Text = Convert.ToString("Normal");
                label3.ForeColor = Color.Black;
            }
           else if        ((BMI > 25) && (BMI < 29.9))
                
             {       label3.Text = Convert.ToString("Over Weight");
                     label3.BackColor = System.Drawing.Color.Green;
                     label3.ForeColor = Color.White;
            } 

            else if (BMI >= 30)
                    label3.Text = Convert.ToString("Obese");
                label3.ForeColor = Color.Red;
        }

3 Ответов

Рейтинг:
6

GenJerDan

Непроверенный, так как у меня здесь нет VS, но вы можете попробовать Label3.Refresh(); или Label3.Update(); я почти уверен, что один из них должен вызвать перерисовку с правильным цветом.

(Кроме того, измените свой код на то, что сказал член 13432091. Более чистый.)


Рейтинг:
20

Member 13432091

Я думаю, что ваши предложения if не совпадают ниже значения BMI.
- ИМТ == 18,5
- 24,9 <= ИМТ && ИМТ <= 25
- 29,9 <= ИМТ && ИМТ < 30

Ниже код будет соответствовать любому значению ИМТ.

if (BMI < 18.5)
{
    // Under Weight
}
else if (BMI < 25)
{
    // Normal
}
else if (BMI < 30)
{
    // Over Weight
}
else
{
    // Obese
}


Рейтинг:
14

OriginalGriff

Во - первых, не используйте методы преобразования с пользовательским вводом-если введенное ими значение не соответствует правильному формату, ваше приложение выйдет из строя. Вместо этого используйте методы TryParse:

double height, weight;
double BMI = 0;
if (!double.TryParse(textBox1.Text, out height))
    {
    MessageBox.Show($"\"{textBox1.Text}\" is not a valid height");
    return;
    }
if (!double.TryParse(textBox2.Text, out weight))
    {
    MessageBox.Show($"\"{textBox3.Text}\" is not a valid weight");
    return;
    }
Во-вторых, вы пропускаете случаи, когда значения равны: 18,5, между 24,9 и 25, между 29,9 и чуть меньше 30.
Измените свои тесты на эти, и вы охватите все случаи (а также сделаете свой код более читабельным):
            if (BMI < 18.5)
                {
...
                }
            else if (BMI < 25.0)
                {
...
                }
            else if (BMI < 30.0)
                {
...
                }
В-третьих, особенно когда вы начинаете работу, всегда используйте фигурные скобки, даже если они не нужны, так ваш код будет более очевиден:
else if (BMI >= 30)
        label3.Text = Convert.ToString(" obese");
    label3.forecolor="Color.Red;
Является эквивалентом:
else if (BMI >= 30)
        {
        label3.Text = Convert.ToString(" obese");
        }
    label3.forecolor="Color.Red;
Это не одно и то же:
else if (BMI >=30)
    {
    label3.Text = Convert.ToString("Obese");
    label3.ForeColor = Color.Red;
    }
И это означает, что ForColor устанавливается в красный цвет каждый раз!
У вас также нет способа сбросить цвет после того, как кто - то набрал лишний вес, поэтому, когда вы устанавливаете задний цвет на зеленый, он никогда больше не возвращается к белому.
Лучший способ сделать это вот так:
BMI = weight / (height * height);
string text = "Major Error!";
Color backColor = SystemColors.Window;
Color foreColor = SystemColors.WindowText;
if (BMI < 18.5)
    {
    text = "Under Weight";
    foreColor = Color.Blue;
    }
else if (BMI < 25.0)
    {
    text = "Normal";
    foreColor = Color.Black;
    }
else if (BMI < 30.0)
    {
    text = "Over Weight";
    backColor = System.Drawing.Color.Green;
    foreColor = Color.White;
    }
else
    {
    text = Convert.ToString("Obese");
    foreColor = Color.Red;
    }
label3.Text = text;
label3.ForeColor = foreColor;
label3.BackColor = backColor;
Заметьте, что я избавился от вашей фальшивки Convert.ToString вызовы также - вам не нужно преобразовывать строку в строку, это просто глупо, и делает ваш код более трудным для чтения.

Наконец, сделайте себе одолжение и прекратите использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что "TextBox8" - это номер мобильного телефона сегодня, но когда вам нужно будет изменить его через три недели, вы это сделаете? Используйте описательные имена - например, "tbMobileNo", - и ваш код станет легче читать, более самодокументируемым, легче поддерживать - и на удивление быстрее кодировать, потому что Intellisense может добраться до "tbMobile" за три нажатия клавиш, где "TextBox8" занимает размышление и 8 нажатий клавиш...