VB.NET如何让多个文本框相互同时计算

时间:2021-12-17 00:55:16
就像如下图所示的单位换算工具,在任意一个文本框中输入数据,其他文本框都能计算出来。

我用过textbox的keyup事件,但有个缺点,将焦点移到另一个文本框,按了键盘Ctrl键或其他键,它以当前文本框的值又重新计算原来的文本框。
就好比下图,如用keyup事件,在“千米/公里”中输入0.6,但按Tab键将焦点移到其他文本框,由于浮点数精度问题,原来的文本框可能变为0.599998。但我希望按Tab键,这些文本框的数字不再改变。只有改变数字时才重新计算。

图片传不上去,详见百度应用(帮帮单位换算):http://www.baidu.com/s?wd=%E5%8D%95%E4%BD%8D%E6%8D%A2%E7%AE%97&tn=ichuner_1_dg&ie=utf-8

8 个解决方案

#1


那为什么不用TextChanged事件?

#2


使用动态数据绑定。

#3


引用 1 楼 iyomumx 的回复:
那为什么不用TextChanged事件?

我试过了,好像不可以。
因为一个文本框的数据改变,另一个文本框的数据也在变,那么这个文本框也同时触发TextChange事件,这样计算肯定会冲突。主要是所有的文本框都是相互关联计算的。

#4


用TextChanged事件

非要用KeyUp,需要判断下Key如果不是字母、删除等改变文本的键,就不要重新计算

#5


引用 4 楼 devmiao 的回复:
用TextChanged事件

非要用KeyUp,需要判断下Key如果不是字母、删除等改变文本的键,就不要重新计算


用TextChanged事件会不会冲突啊,主要是所有的文本框都是相互关联计算的。

比如下面,就不是我想要的。
    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        TextBox2.Text = TextBox1.Text * 3
    End Sub

    Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
        TextBox1.Text = TextBox2.Text / 5
    End Sub

#6


引用 2 楼 greatbody 的回复:
使用动态数据绑定。

怎么使用,我没这方面基础

#7


textChanged可以实现
你只要在执行运算前,判断一下当前文本框是不是有输入焦点就行
    Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
        If TextBox1.Focused Then
            TextBox2.Text = TextBox1.Text * 3
        End If
    End Sub

    Private Sub TextBox2_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox2.TextChanged
        If TextBox2.Focused Then
            TextBox1.Text = TextBox1.Text / 3
        End If
    End Sub

#8


引用 7 楼 Runnerchin 的回复:
textChanged可以实现
你只要在执行运算前,判断一下当前文本框是不是有输入焦点就行
    Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
        If TextBox1.Focused Then
            TextBox2.Text = TextBox1.Text * 3
        End If
    End Sub

    Private Sub TextBox2_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox2.TextChanged
        If TextBox2.Focused Then
            TextBox1.Text = TextBox1.Text / 3
        End If
    End Sub




嗯。确实是这样

#1


那为什么不用TextChanged事件?

#2


使用动态数据绑定。

#3


引用 1 楼 iyomumx 的回复:
那为什么不用TextChanged事件?

我试过了,好像不可以。
因为一个文本框的数据改变,另一个文本框的数据也在变,那么这个文本框也同时触发TextChange事件,这样计算肯定会冲突。主要是所有的文本框都是相互关联计算的。

#4


用TextChanged事件

非要用KeyUp,需要判断下Key如果不是字母、删除等改变文本的键,就不要重新计算

#5


引用 4 楼 devmiao 的回复:
用TextChanged事件

非要用KeyUp,需要判断下Key如果不是字母、删除等改变文本的键,就不要重新计算


用TextChanged事件会不会冲突啊,主要是所有的文本框都是相互关联计算的。

比如下面,就不是我想要的。
    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        TextBox2.Text = TextBox1.Text * 3
    End Sub

    Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
        TextBox1.Text = TextBox2.Text / 5
    End Sub

#6


引用 2 楼 greatbody 的回复:
使用动态数据绑定。

怎么使用,我没这方面基础

#7


textChanged可以实现
你只要在执行运算前,判断一下当前文本框是不是有输入焦点就行
    Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
        If TextBox1.Focused Then
            TextBox2.Text = TextBox1.Text * 3
        End If
    End Sub

    Private Sub TextBox2_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox2.TextChanged
        If TextBox2.Focused Then
            TextBox1.Text = TextBox1.Text / 3
        End If
    End Sub

#8


引用 7 楼 Runnerchin 的回复:
textChanged可以实现
你只要在执行运算前,判断一下当前文本框是不是有输入焦点就行
    Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
        If TextBox1.Focused Then
            TextBox2.Text = TextBox1.Text * 3
        End If
    End Sub

    Private Sub TextBox2_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox2.TextChanged
        If TextBox2.Focused Then
            TextBox1.Text = TextBox1.Text / 3
        End If
    End Sub




嗯。确实是这样