我正在创建一个菜单应用程序,我目前有3个文本框,textbox1是价格,textbox2是数量,textbox3是总数。我已经成功编写了代码来计算项目的价格,具体取决于他们需要的数量。我现在的代码:
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
TextBox8.Text = CStr(Val(TextBox6.Text) * Val(TextBox7.Text))
End Sub
现在我需要的是我会有更多的项目说10以及旁边的文本框作为数量,这使得20个文本框和一个总文本框。我如何编写代码,以便计算每个文本框以及空值,如果在10个项目中我只想要每个数量2个项目1到总值。
由于
答案 0 :(得分:2)
首先,我强烈建议使用.NET方法而不是旧的VB方法。我也会将OPTION STRICT
设置为On
,这样可以避免"魔法"运行时为您完成的转换。相反,你必须指定正确的类型,这是一件好事,因为它可以防止运行时出错,也有助于学习.NET类型和方法。
我会将这些TextBox全部添加到同一个容器控件中(如Panel
或类似的东西)。我还建议为控件使用更有意义的名称(f.e。TxtTotal
作为总文本框)。
所以如果所有价格文本框都是'名称以TxtPrice
开头(f.e。TxtPrice1
等),所有quantity-TextBox都以TxtQuantity
开头(f.e。TxtQuantity1
等),这种LINQ查询方法将起作用:
Dim allTextBoxes = PriceQuantityPanel.Controls.OfType(Of TextBox)()
Dim allPrices = From txt In allTextBoxes
Where txt.Name.StartsWith("TxtPrice")
Dim allQuantities = From txt In allTextBoxes
Where txt.Name.StartsWith("TxtQuantity")
Dim price As Decimal
Dim invalidPrices = From txt In allPrices
Where Not Decimal.TryParse(txt.Text, price)
If invalidPrices.Any() Then
MessageBox.Show("Please enter valid prices(Decimal)!")
Return
End If
Dim quantity As Int32
Dim invalidQuantities = From txt In allQuantities
Where Not Int32.TryParse(txt.Text, quantity)
If invalidQuantities.Any() Then
MessageBox.Show("Please enter valid quantities(Integer)!")
Return
End If
现在你可以加入"价格和数量的文本框对由数字后缀:
组成Dim query = From txtP In allPrices
Join txtQ In allQuantities
On txtP.Name.Substring("TxtPrice".Length) Equals txtQ.Name.Substring("TxtQuantity".Length)
Select New With {.Price = Decimal.Parse(txtP.Text), .Quantity = Int32.Parse(txtQ.Text)}
Dim totalSum As Decimal = query.Sum(Function(x) x.Price * x.Quantity)
TxtTotal.Text = totalSum.ToString()