作为在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();
}
有人可以看到此代码段出了什么问题吗?
答案 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();
}
}