C# - 将输入从一个文本框复制到另一个文本框,反之亦然

C# - Copy input from one textbox to another and vise versa

这是我的第一个 post,我对 C# 还很陌生 我正在尝试创建摄氏度到华氏度转换器,反之亦然。

我有两个文本框,用户可以在摄氏度文本框中输入数字,华氏度会自动计算并显示在华氏度文本框中,或者用户可以在华氏度中输入数字,然后计算摄氏度值并显示在华氏度文本框中输出。

这是我目前的代码,这是一个 WFA。

private void txtCelsius_TextChanged(object sender, EventArgs e)
    {
        ///*
        if(string.IsNullOrEmpty(txtCelsius.Text))
        {
            txtFahrenheit.Clear();
            return;

        }
        txtFahrenheit.Text = ((double.Parse(txtCelsius.Text)) * 1.8 + 32).ToString();
        //*/
    }

    private void txtFahrenheit_TextChanged_1(object sender, EventArgs e)
    {
        ///*
        if (string.IsNullOrEmpty(txtFahrenheit.Text))
        {
            txtCelsius.Clear();
            return;
        }
        txtCelsius.Text = ((double.Parse(txtFahrenheit.Text)) / 1.8 - 32).ToString();
        //*/
    }

显然,当我 运行 这样做并在其中一个文本框中输入一个值时,它将创建一个无限循环。如果我评论一个或另一个,它对另一个有效。

有人可以帮忙吗?有没有办法可以做类似下面的伪代码。

if textbox1 is getting input
    textbox2.input = disabled
    do calculations and display
if textbox2 is getting input
    textbox1.input = disabled
    do calculations and display

如果尝试寻找解决方案,但发现很难用语言表达我要寻找的内容并且没有找到解决方案。

PS。我一直在其他 post 看到这个,这不是作业,我只是想想出小程序来学习。

您正在进入无限循环,因为每次更新其他文本框值时都会触发 TextChanged 事件。要处理此问题,请添加一个变量来控制何时使用 TextChanged 代码进行更新。

bool _updating = false;
private void txtCelsius_TextChanged(object sender, EventArgs e)
{
   if (!_updating)
   {
     try
     {
       _updating = true;
       ///*
       if(string.IsNullOrEmpty(txtCelsius.Text))
       {
         txtFahrenheit.Clear();
         return;
       }
       txtFahrenheit.Text = ((double.Parse(txtCelsius.Text)) * 1.8 + 32).ToString();
       //*/
     }
     finally
     {
       _updating = false;
     }
   }
}

private void txtFahrenheit_TextChanged_1(object sender, EventArgs e)
{
   if (!_updating)
   {
     try
     {
       _updating = true;
       ///*
       if (string.IsNullOrEmpty(txtFahrenheit.Text))
       {
         txtCelsius.Clear();
         return;
       }
       txtCelsius.Text = ((double.Parse(txtFahrenheit.Text)) / 1.8 - 32).ToString();
       //*/
     }
     finally
     {
       _updating = false;
     }
   }
}