【问题标题】:VB windows form calculate the digit in a multiline textboxVB windows窗体计算多行文本框中的数字
【发布时间】:2025-12-24 23:05:13
【问题描述】:

我想计算每一行:就像第一行 123*1.616 和第二行 213*1.616,并显示每个总数。 在公斤文本框中输入的每个数字将乘以 1.616,然后在 kati 标签中显示结果。 这是我的代码:

Private Sub b1_Click(sender As Object, e As EventArgs) Handles b1.Enter

For Each digit In (TextBox1.Text)
            total1 = Val(digit) * 1.616
            Label9.Text = total1
        Next

        Label9.Text = total1
End sub

请帮我找到一些解决方案或解释来实现输出。

【问题讨论】:

  • 设置Option Strict On。可能还有Option Explicit On。并调试它。你会看到
  • 1) Handles b1.Enter 应该是 Handles b1.Click。 2)要从TextBox中获取每一行文本,可以使用For Each line in TextBox1.Lines。 3) 知道 digit 是单个数字字符会很有帮助,例如“3”,因此数字 123 有三个数字。
  • 看看@Andrew Morton 的陈述。你的代码是b1.Enter。那里发生了什么?另外,您期望 TextBox 中的值是多少?整数还是其他?
  • 我希望公斤文本框中的每一行将乘以 1.616 并显示在 kati 中。这意味着 kati 将在公斤文本框中得到每一行的答案
  • 我看的越多,它就越离奇......你说1.616 的多个文本框并给出了示例:123,213,123 和示例答案:4.848,16.11,4.848。这不是输入值乘以1.616 的正确答案。我错过了什么?

标签: vb.net textbox multiline


【解决方案1】:

这应该可以工作

Private FACTOR As Decimal = 1.616
Private SEPARATOR As String = Environment.NewLine

Private Sub b1_Click(sender As Object, e As EventArgs) Handles b1.Click
    Label9.Text = TextBox1.Text.
        Split({SEPARATOR}, StringSplitOptions.RemoveEmptyEntries).
        Select(Function(s1) $"{Decimal.Parse(s1) * FACTOR:0.00#}").
        Aggregate(Function(s1, s2) $"{s1}{SEPARATOR}{s2}")
End Sub

这是 LINQ 中的函数

  • Split 使用 SEPARATOR 作为分隔符将 TextBox 中的每一行组成一个数组
  • Select 将元素转换为它们的值乘以 FACTOR
  • Aggregate 将元素重新组合到一个分隔符分隔的字符串中

为什么您的原始代码不起作用?

  • 您正在遍历文本中的每个字符,并将该字符乘以浮点数(Option Strict On,如 cmets 中所建议的那样会阻止这种情况发生)。
  • 然后在每次迭代中,您都会执行(简化)Label9.Text = Val(digit) * 1.616,它每次都会覆盖标签。
  • 如果您在调试中单步执行(在 cmets 中也建议),您会看到标签变为 1x1.616=1.6162x1.616=3.2323x1.616=4.848 等。结果是最后一个字符 在你的文本框中,'3',乘以 1.161 = 4.848。显然,这不是你想要的。您需要迭代每个整数。多行文本框用新行分隔每一行。所以我们改为遍历每一行

【讨论】:

    【解决方案2】:

    您可以通过 vbCrLf 使用拆分字符串

    Sub main()
    
    
      Dim multilinetext As String =
        "10
         20
         30
         40
         50
         60"
    
        Dim number_array = multilinetext.Split(vbCrLf)
        Dim output As Integer = 0
        For Each i In number_array
            output += i
        Next
        Stop
    End Sub
    

    【讨论】:

    • Dim multilinetext As String = TextBox1 出现错误“无法将文本框转换为字符串”
    • TextBox1是一个文本框类,需要访问TextBox1.text才能访问文本框的字符串。请删除奉献,因为它无效并且您误解了代码的工作原理。
    • 好的,谢谢,看起来另一个人是专业的巨魔,谢谢你的回复,祝你编码好运。
    • 另外,如果你不是那个投反对票的人,那么我收回我关于专业巨魔的声明并为我的声明道歉。
    • @MattheuNorwood 我也使用String.Split()。请注意Environment.NewLine is preferred over vbCrLf - 不是很重要。但是您也可以从将Option Strict On 放在代码顶部中受益。 multilinetext.Split(vbCrLf) 创建一个 string 数组,然后迭代它 For Each i In number_array 并将每个 i(字符串)添加到 output(整数)。 OP 最终会得到一个总和,但是,由于 output 是一个整数,他会在他的示例中丢失小数(无论如何都不需要总和)。