user3562155
user3562155

Reputation: 51

Multiplying multiple texboxes

I am creating a menu application, I have at the moment 3 textboxes, textbox1 is price, textbox2 is quantity and textbox3 is total. I have successfully written the code to calculate the price of an item depending on the quantity they need. The code i have right now:

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    TextBox8.Text = CStr(Val(TextBox6.Text) * Val(TextBox7.Text))
End Sub

Now what I need is that I will have more items say 10 along with textboxes beside as quantity which makes 20 textboxes and one total textbox. How can I write the code so that it calculates every textbox as well as null values say if out of the 10 items i want only 2 items 1 per quantity into the total value.

Thanks

Upvotes: 1

Views: 404

Answers (1)

Tim Schmelter
Tim Schmelter

Reputation: 460238

First, i strongly suggest to use .NET methods instead of old VB methods. I also would set OPTION STRICT to On in general which avoids "magical" conversions done for you by the runtime. Instead you have to specify the correct types which is a good thing since it can prevent errors on runtime and it also helps to learn the .NET types and methods.

I would add those TextBoxes all to the same container-control (like a Panel or something similar). I also suggest to use more meaningful names for your controls(f.e. TxtTotal for the total-textbox).

So if all price-textboxes' names start with TxtPrice (f.e. TxtPrice1 etc) and all quantity-TextBoxes start with TxtQuantity (f.e. TxtQuantity1 etc), this LINQ query approach will work:

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

Now you can "join" the pairs of price and quantity textboxes by the number-suffix:

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()

Upvotes: 2

Related Questions