Evan
Evan

Reputation: 25

How to use a loop through multiple similar textboxes?

So I know this is pretty sloppy, but I have a lot going on for a simple triangulation program (2d) and I'm very new.

The user inputs value in textboxes- "aft1.text,ain1.text,aft2.text,ain2.text,bft1.text,bin1.text,bft2.text,bin1.text." This goes on for as many points that need triangulated. I want to be able to run a loop through these similar textboxes, and run a function on them.

So for each textbox that starts with abft + i and ain + i run the inches function to create a1.

Do the same to create b1.

Then another loop to plot a + i and b + i on the chart per the xcoord/ycoord functions created.

    Dim a1 As Double = inches(aft1.Text, ain1.Text)
    Dim b1 As Double = inches(bft1.Text, bin1.Text)

    If a1 <> 0 And b1 <> 0 Then
        Dim targetpoint As Int32
        targetpoint = Chart1.Series("Drawing").Points.AddXY((xcoord(a1, b1)), ((ycoord(a1, b1))))
        Chart1.Series("Drawing").Points.Item(targetpoint).Label = "1"
    End If

    Dim a2 As Double = inches(aft2.Text, ain2.Text)
    Dim b2 As Double = inches(bft2.Text, bin2.Text)

    If a2 <> 0 And b2 <> 0 Then
        Dim targetpoint As Int32
        targetpoint = Chart1.Series("Drawing").Points.AddXY((xcoord(a2, b2)), ((ycoord(a2, b2))))
        Chart1.Series("Drawing").Points.Item(targetpoint).Label = "2"
    End If


    Dim a3 As Double = inches(aft3.Text, ain3.Text)
    Dim b3 As Double = inches(bft3.Text, bin3.Text)

    If a3 <> 0 And b3 <> 0 Then
        Dim targetpoint As Int32
        targetpoint = Chart1.Series("Drawing").Points.AddXY((xcoord(a3, b3)), ((ycoord(a3, b3))))
        Chart1.Series("Drawing").Points.Item(targetpoint).Label = "3"
    End If

Upvotes: 1

Views: 111

Answers (1)

ron tornambe
ron tornambe

Reputation: 10780

If I understand you correctly, this code can be easily generalized by creating a Sub and calling it with your inches calculation and Label text,:oord are reachable (in scope) Functions:

Triangulate(inches(aft1.Text, ain1.Text), inches(bft1.Text, bin1.Text), 1)
Triangulate(inches(aft2.Text, ain2.Text), inches(bft2.Text, bin2.Text), 2)
Triangulate(inches(aft3.Text, ain3.Text), inches(bft3.Text, bin3.Text), 3)

EDIT-2

Although I have tested the following up to a point, since I do not have your chart properties nor the inches, xcoord and ycoord functions I could not test it completely, so try it out and let me know how it goes.

Sub TriangulateAll()
    Try

        Dim aft As New SortedList(Of String, TextBox)
        Dim ain As New SortedList(Of String, TextBox)
        Dim bft As New SortedList(Of String, TextBox)
        Dim bin As New SortedList(Of String, TextBox)

        For Each ctl As Control In Controls
            If TypeOf (ctl) Is TextBox Then
                Select Case ctl.Name.Substring(0, 3)
                    Case "aft"
                        aft.Add(ctl.Name, ctl)
                    Case "ain"
                        ain.Add(ctl.Name, ctl)
                    Case "bft"
                        bft.Add(ctl.Name, ctl)
                    Case "bin"
                        bin.Add(ctl.Name, ctl)
                End Select
            End If
        Next
        Dim a As New List(Of Double)
        Dim b As New List(Of Double)

        For Each kvp_aft As KeyValuePair(Of String, TextBox) In aft
            For Each kvp_ain As KeyValuePair(Of String, TextBox) In ain
                a.Add(inches(kvp_aft.Value.Text, kvp_ain.Value.Text))
            Next
        Next
        For Each kvp_bft As KeyValuePair(Of String, TextBox) In bft
            For Each kvp_bin As KeyValuePair(Of String, TextBox) In bin
                b.Add(inches(kvp_bft.Value.Text, kvp_bin.Value.Text))
            Next
        Next
        For i As Int16 = 0 To aft.Count - 1
            Triangulate(a(i), b(i), i.ToString())
        Next
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

EDIT Replace the 3 calls to Triangulate with the following code to completely generalize the Triangulation routine. Note that this routine expects there to be an equal number of each of the TextBox controls: aft, ain, bft, bin. I haven't tested this but it should work.

    Dim aft As List(Of TextBox) = Nothing
    Dim ain As List(Of TextBox) = Nothing
    Dim bft As List(Of TextBox) = Nothing
    Dim bin As List(Of TextBox) = Nothing

    For Each ctl As Control In Controls
        If TypeOf (ctl) Is TextBox Then
            Select Case ctl.Name.Substring(0, 2)
                Case "aft"
                    aft.Add(ctl)
                Case "ain"
                    ain.Add(ctl)
                Case "bft"
                    bft.Add(ctl)
                Case "bin"
                    bin.Add(ctl)
            End Select
        End If
    Next
    aft.Sort()
    ain.Sort()
    bft.Sort()
    bin.Sort()

    For i As Int16 = 0 To aft.Count - 1
        Dim a As Double = inches(aft.Item(i).Text, ain.Item(i).Text)
        Dim b As Double = inches(bft.Item(i).Text, bin.Item(i).Text)
        Triangulate(a, b, i.ToString())
    Next

   Sub Triangulate(a As Double, b As Double, LabelValue As String)
       If a <> 0 And b <> 0 Then
           Dim targetpoint As Int32
           targetpoint = Chart1.Series("Drawing").Points.AddXY((xcoord(a, b)), ((ycoord(a, b))))
           Chart1.Series("Drawing").Points.Item(targetpoint).Label = LabelValue
       End If
   End Sub

Upvotes: 1

Related Questions