我如何让应用程序采取正确的输入..?

时间:2012-11-14 16:53:50

标签: c#

这是我的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 = "";
        }
    }

}
}

2 个答案:

答案 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() ;