你好,我是这个网站的新手,所以如果我没有正确解释,我很抱歉:
我正在创建一个C#Form应用程序,我的应用程序没有错误,但是一旦我清除输入字段,就会给我一个FormatException unhandeld。
这是此功能的唯一适用代码:
private void txtR_TextChanged(object sender, EventArgs e)
{
R = Convert.ToInt32(txtR.Text);
E2 = Convert.ToInt32(txtE2.Text);
E = R * E2;
txtE.Text = E.ToString();
R = Convert.ToInt32(txtR.Text);
D2 = Convert.ToInt32(txtD2.Text);
D = R * D2;
txtD.Text = D.ToString();
R = Convert.ToInt32(txtR.Text);
P2 = Convert.ToInt32(txtP2.Text);
P = R * P2;
txtP.Text = P.ToString();
}
答案 0 :(得分:2)
函数Convert.ToInt32()
无法处理零长度字符串,因此您不能将txtR
(或任何其他文本字段)留空。
此外,我建议您考虑不在onTextChanged
事件中运行此代码。常见的情况可能是您删除txtR
的内容,从而触发onTextChanged
并抛出异常。
在任何情况下,为了使您的代码能够防弹,最好使用Int32.TryParse()
来确保转换能够正常工作,正如sharp12345建议的那样。
Convert.ToInt32()
文档:MSDN link。阅读FormatException
位。
答案 1 :(得分:1)
清除字段时出现错误的原因是因为您尝试将空字符串转换为数字。清除该字段时,txtR
等于String.Empty,因此无法将其转换为数字。当它是空的时候:
R = Convert.ToInt32(txtR.Text);
几乎与:
相同R = Convert.ToInt32("");
它无法做到。要解决此问题,首先需要检查所有字段是否都有值:
private void txtR_TextChanged(object sender, EventArgs e)
{
if(txtR.Text.Trim().Length != 0
&& txtE2.Text.Trim().Length != 0
&& txtD2.Text.Trim().Length != 0
&& txtP2.Text.Trim().Length != 0)
{
R = float.Parse(txtR.Text);
E2 = float.Parse(txtE2.Text);
E = R * E2;
txtE.Text = E.ToString();
R = float.Parse(txtR.Text);
D2 = float.Parse(txtD2.Text);
D = R * D2;
txtD.Text = D.ToString();
R = float.Parse(txtR.Text);
P2 = float.Parse(txtP2.Text);
P = R * P2;
txtP.Text = P.ToString();
}
else{
MessageBox.Show("One or more of the fields were empty!");
{
}
希望这有帮助!
答案 2 :(得分:1)
您应该使用int.TryParse()
来检查输入的值是否正确,而不是空或字符串。
所以,这段代码:
R = Convert.ToInt32(txtR.Text);
E2 = Convert.ToInt32(txtE2.Text);
E = R * E2;
txtE.Text = E.ToString();
应转换为:
if (int.TryParse(txtR.Text, out R) && int.TryParse(txtE2.Text, out E2)) {
E = R * E2;
txtE.Text = E.ToString();
}
同样适用于float就像int。
答案 3 :(得分:0)
在以数字值转换用户输入字符串时使用Single.TryParse
(在您的情况下浮动,而不是整数)。
通常,您无法轻易阻止用户插入一些虚假值,您的代码将失败
相反,TryParse允许您在输入无效的情况下毫无例外地测试输入字符串
// Try to convert the R value just one time, everything fails if this fails
if(!Single.TryParse(txtR.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out R))
return;
if(Single.TryParse(txtE2.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out E2))
{
E = R * E2;
txtE.Text = E.ToString();
}
if(Single.TryParse(txtD2.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out D2))
{
D = R * D2;
txtD.Text = D.ToString();
}
if(Single.TryParse(txtP2.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out P2))
{
P = R * P2;
txtP.Text = P.ToString();
}
MSDN上的See here作为参考