尝试从另一个文本框更新一个文本框,反之亦然C#Winforms

时间:2014-08-05 18:31:24

标签: c# winforms sender

我在Winform上有两个文本框。我们的想法是在一个方框中输入华氏温度,然后在用户输入时将Celcius显示在另一个方框中,反之亦然。

我使用'离开'文本框的方法,但我试图使用TextChanged方法,以避免必须单击或按下结果的按钮。

我现在遇到的问题是,当处理第一个字符时,焦点移动到第二个框,这会触发TextChanged方法。

我已尝试使用发件人启用if(),但发件人现在是目标框。

有什么想法吗?

       private void TB_Fahrenheit_TextChanged(object sender, EventArgs e)
    {

        float C, F;

        if (TB_Fahrenheit.Text != "")
        {
            if (float.Parse(TB_Fahrenheit.Text) < 1.0F)
            {
                TB_Fahrenheit.Text = "0" + TB_Fahrenheit.Text;
            }

            F = float.Parse(TB_Fahrenheit.Text);
            C = ((F - 32) * 5) / 9;
            TB_Celcius.Text = C.ToString();
        }

    }

    private void TB_Celcius_TextChanged(object sender, EventArgs e)
    {
        float C, F;
        string SentBy = ((TextBox)sender).Name;

        MessageBox.Show(SentBy);
        return;

        if(SentBy != TB_Fahrenheit.Text)
        {

        if (TB_Celcius.Text != "")
        {
            if (float.Parse(TB_Celcius.Text) < 1.0F)
            {
                TB_Celcius.Text = "0" + TB_Celcius.Text;
            }

            C = float.Parse(TB_Celcius.Text);
            F = ((C * 9) / 5) + 32;
            TB_Fahrenheit.Text = F.ToString();
        }
        }

    }

    private void TB_Celcius_Enter(object sender, EventArgs e)
    {
        TB_Celcius.Clear();
        TB_Fahrenheit.Clear();
    }

    private void TB_Fahrenheit_Enter(object sender, EventArgs e)
    {
        TB_Celcius.Clear();
        TB_Fahrenheit.Clear();
    }

4 个答案:

答案 0 :(得分:3)

我会使用布尔检查器。您正在更改具有文本更改事件的文本框的文本。如果当前正在编辑其他框,则需要确保它不执行任何操作。我的例子

private void setSliderValue(int currentAudioSecond)
{
    valueFromTimer = true;
    //Do Stuff
    valueFromTimer = false;
}

然后在滑块控件上更改值时:

private void sliderAudio_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    if (!valueFromTimer)
    {
        //Do stuff  
    }
}

我在加载窗口或表单时经常这样做,我填充一个组合框。为了避免将选定的值/索引更改为触发,我必须实现这样的标志。

答案 1 :(得分:2)

我只需在Control.Enter EventControl.Leave Event订阅和取消订阅该活动。

当你Enter fahrenheitTextBox时,它会停用你的celsiusTextBox的TextChanged事件。输入celsiusTextBox时会发生相同的情况,您的fahrenheitTextBox.TextChanged事件将被取消订阅,允许您利用正确的事件TextChanged事件来实现您的目标。

除此之外,我不鼓励在GUI中使用数学公式,因为你可能有错,而且很难测试。最好有一个静态Convert类,并为您提供适当的转换方法。

public static class Convert {
    public float ToFahrenheit(float celsius) {
        float f = celsius * 9 / 5 + 32;
        return f;
    }

    public float ToCelsius(float fahrenheit) {
        float c = (fahrenheit - 32) * 5 / 9;
        return c;
    }
}

然后你可以编写单元测试。

[TestMethod]
public void ZeroCelsiusShouldConvertTo32Fahrenheit() {
    // Given
    float expected 32.0;
    float celsius = 0.0;        


    // When
    var actual = Convert.ToFahrenheit(celsius);

    // Then
    Assert.AreEqual(typeof(float), actual);
    Assert.AreEqual(expected, actual);
}

答案 2 :(得分:1)

我认为您必须使用Leave事件而不是TextChanged。因为它是在

时引发的
  1. 通过使用键盘(TAB,SHIFT + TAB等),通过调用Select或SelectNextControl方法或将ContainerControl.ActiveControl属性设置为当前表单来更改焦点。

  2. 使用鼠标或调用Focus方法更改焦点时。

答案 3 :(得分:0)

我建议使用KeyPress事件来计算其他TextBox中的值,就像这样,尽管你必须对float.Parse进行一些格式检查,以确保你有一个数值。

        private void TB_Fahrenheit_KeyPress(object sender, KeyPressEventArgs e)
    {
        float C, F;

        if (TB_Fahrenheit.Text != "")
        {
            if (float.Parse(TB_Fahrenheit.Text) < 1.0F)
            {
                TB_Fahrenheit.Text = "0" + TB_Fahrenheit.Text;
            }

            F = float.Parse(TB_Fahrenheit.Text);
            C = ((F - 32) * 5) / 9;
            TB_Celcius.Text = C.ToString();
        }
    }

    private void TB_Celcius_KeyPress(object sender, KeyPressEventArgs e)
    {
        float C, F;
        string SentBy = ((TextBox)sender).Name;


        if (TB_Celcius.Text != "")
        {
            if (float.Parse(TB_Celcius.Text) < 1.0F)
            {
                TB_Celcius.Text = "0" + TB_Celcius.Text;
            }

            C = float.Parse(TB_Celcius.Text);
            F = ((C * 9) / 5) + 32;
            TB_Fahrenheit.Text = F.ToString();
        }

    }