сделать метку видимой при вводе неверных данных - PullRequest
0 голосов
/ 27 июня 2018

В качестве упражнения при создании приложений Windows на C # мне нужно создать простой калькулятор. Во время нажатия кнопки Event я должен использовать TryParse для получения данных из текстовых полей и проверки их корректности.

Проблема, с которой я сталкиваюсь, заключается в том, что при обнаружении недействительных данных label1 должен стать видимым, изменить цвет шрифта и отобразить сообщение. Это не работает. Если я использую окно сообщения, оно всплывает и ярлык обновляется. С комментариями в окне сообщений ярлык остается скрытым, и приложение блокируется при вводе неверных данных во время тестирования.

private void btnAdd_Click(object sender, EventArgs e)
{
    ushort operand1;
    ushort operand2;

    while((UInt16.TryParse(txtOperand1.Text, out operand1) & UInt16.TryParse(txtOperand2.Text, out operand2)) == false)
    {
        // MessageBox.Show("not number");
        label1.Visible = true;
        label1.ForeColor = Color.Red;
        label1.Text = "Value must be numeric and > 0";
    }

    int result;

    result = operand1 + operand2;

    label1.Visible = true;
    label1.Text = string.Format("{0:N}", result).ToString();
}

Кто-нибудь может увидеть, что не так с этим фрагментом кода?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вы выполняете цикл while() в потоке пользовательского интерфейса, что означает, что он слишком занят в цикле для обработки ваших входных данных и поэтому зависает.

Быстрый взлом состоял бы в том, чтобы поместить Application.DoEvents() в цикл. Это говорит потоку пользовательского интерфейса на мгновение остановить то, что он делает, и обработать ожидающие события. Я бы действительно предложил не делать этого, хотя это, вероятно, худший способ, которым вы могли бы поддерживать отзывчивость вашего пользовательского интерфейса.

Зачем вам вообще нужен цикл? Просто сделайте проверку один раз, когда кнопка нажата, и затем предоставьте пользователю свой отзыв.

private void btnAdd_Click(object sender, EventArgs e)
{
    ushort operand1;
    ushort operand2;

    bool validInput = UInt16.TryParse(txtOperand1.Text, out operand1) && 
                      UInt16.TryParse(txtOperand2.Text, out operand2);

     if(!validInput)
     {
         // MessageBox.Show("not number");
         label1.Visible = true;
         label1.ForeColor = Color.Red;
         label1.Text = "Value must be numeric and > 0";
     }
     else
     {
         int result;
         result = operand1 + operand2;
         label1.Visible = true;
         label1.Text = string.Format("{0:N}", result).ToString();
     }  
}
0 голосов
/ 27 июня 2018

Ваша программа блокирует недопустимые данные из-за использования вами цикла while. Вместо этого вы должны использовать только оператор if\else, потому что вы хотите, чтобы на вашем ярлыке отображалось сообщение об ошибке или вычисленный результат.

Измените свой код на что-то вроде:

private void btnAdd_Click(object sender, EventArgs e)
{
    ushort operand1;
    ushort operand2;

    if((UInt16.TryParse(txtOperand1.Text, out operand1) &&
        UInt16.TryParse(txtOperand2.Text, out operand2)) == false)
    {
        // MessageBox.Show("not number");
        label1.Visible = true;
        label1.ForeColor = Color.Red;
        label1.Text = "Value must be numeric and > 0";
    }
    else
    {
        label1.Visible = true;
        label1.Text = string.Format("{0:N}", operand1 + operand2).ToString();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...