【问题标题】:Trying to update one textbox from another and vice-versa C# Winforms尝试从另一个文本框更新一个文本框,反之亦然 C# Winforms
【发布时间】:2014-08-05 18:31:23
【问题描述】:

我在 Winform 上有两个文本框。这个想法是在一个框中输入华氏温度,并让它在另一个框中显示摄氏度作为用户键入,反之亦然。

我使用文本框的“离开”方法可以正常工作,但我试图使用 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();
    }

【问题讨论】:

    标签: c# winforms sender


    【解决方案1】:

    我会使用布尔检查器。您正在更改具有文本更改事件的文本框的文本。如果当前正在编辑另一个框,您需要确保它什么都不做。我的例子

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

    然后当我的滑块控件上的值发生变化时:

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

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

    【讨论】:

    • 好主意。每当我有一个带有 DataGrid 或其他 UI 元素的项目时,我都会使用类似的方法,我可能会以编程方式更改元素。这样,如果我以编程方式更改用户也可以编辑的元素,我可以避免触发事件。
    • 安德鲁,我发现了类似的东西,现在这对我有用。谢谢。史蒂夫。
    【解决方案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);
    }
    

    【讨论】:

    • 会的,谢谢。我做了更多的搜索,现在我基本上正在这样做,但是在 Enter 事件上设置了一个布尔值作为标志。我将检测 TextChanged 方法中的标志。感谢帮助。史蒂夫。
    【解决方案3】:

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

    1. 您可以通过使用键盘(TAB、SHIFT+TAB 等)、调用 Select 或 SelectNextControl 方法或将 ContainerControl.ActiveControl 属性设置为当前窗体来更改焦点。

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

    【讨论】:

    • 谢谢,但这是我试图避免的。使用 Leave 事件意味着在手动移动焦点之前不会显示任何内容。
    • @Cimbian:你为什么要避免它?
    • 因为我正在做的事情看起来更好。随着输入的变化,输出也会自动更新。
    【解决方案4】:

    我建议使用 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();
            }
    
        }
    

    【讨论】:

    • 我正在使用 KeyPress 事件来构建我的字符串并检查每个输入中的数字、小数或符号,但在移动焦点或通过 TextChanged(我认为)之前,字符串值不可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多