输入无效数据时使标签可见

时间:2018-06-27 19:07:01

标签: c# winforms

作为在C#中创建Windows应用程序的练习,我必须创建一个简单的计算器。在事件按钮期间,我希望使用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 :(得分:2)

由于使用了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();
    }
}

答案 1 :(得分:0)

您正在UI线程上进行while()循环,这意味着它在循环中太忙而无法处理您的输入,因此挂起。

一个快速的技巧是将Application.DoEvents()放入循环中。这告诉UI线程暂时停止正在执行的操作并处理未决事件。我确实建议不要这样做,因为这可能是使UI保持响应状态的最差方法。

为什么首先需要循环?只需在单击按钮时进行一次检查,然后向用户提供反馈。

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