这是我的Windows应用程序的一个布局,将摄氏温度转换为华氏温度。问题是,当我尝试输入温度时,它会显示一些垃圾(例如:如果我输入'3'显示'3.0000009'),有时甚至显示堆栈溢出异常。输出也未正确显示:
cel.text
是摄氏度的文本框。
fahre.text
是华氏温度的文本框。
namespace PanoramaApp1
{
public partial class FahretoCel : PhoneApplicationPage
{
public FahretoCel()
{
InitializeComponent();
}
private void fahre_TextChanged(object sender, TextChangedEventArgs e)
{
if (fahre.Text != "")
{
try
{
double F = Convert.ToDouble(fahre.Text);
cel.Text = "" + ((5.0/9.0) * (F - 32)) ; //this is conversion expression
}
catch (FormatException)
{
fahre.Text = "";
cel.Text = "";
}
}
else
{
cel.Text = "";
}
}
private void cel_TextChanged(object sender, TextChangedEventArgs e)
{
if (cel.Text != "")
{
try
{
Double c = Convert.ToDouble(cel.Text);
fahre.Text = "" + ((c *(9.0 / 5.0 )) + 32);
}
catch (FormatException)
{
fahre.Text = "";
cel.Text = "";
}
}
else
{
fahre.Text = "";
}
}
}
}
答案 0 :(得分:2)
正在发生的事情是,您的Text_Changed
事件处理程序是否相互触发,并且他们不断更改彼此的文本。
当你从摄氏温度转换为farenheit时,它会无限期地转换回来。
这解释了堆栈溢出错误和输入文本更改。
我会做什么,我是否会使用按钮OR执行转换,您可以使用一个布尔变量来打开或关闭其他事件处理程序。
想象一下这样的事情
protected bool textChangedEnabled = true;
private void cel_TextChanged(object sender, TextChangedEventArgs e)
{
if(textChangedEnabled)
{
textChangedEnabled = false;
if (cel.Text != "")
{
try
{
Double c = Convert.ToDouble(cel.Text);
fahre.Text = "" + ((c *(9.0 / 5.0 )) + 32);
}
catch (FormatException)
{
fahre.Text = "";
cel.Text = "";
}
}
else
{
fahre.Text = "";
}
textChangedEnabled = true;
}
}
这可能是一种更优雅,更安全的方式来实现它,但这只是一个简单的修复。
答案 1 :(得分:1)
您可以使用Math.Round将值四舍五入到所需的位数。四舍五入将删除小数部分。
更改
cel.Text = "" + ((5.0/9.0) * (F - 32)) ;
要
cel.Text = Math.Round( ((5.0/9.0) * (F - 32)), 2).ToString() ;