Matt
Matt

Reputation: 1570

VB.NET Iterating Form Labels

I have several label boxes on my design form that all share the naming convention lbl_#.text where # ranges from 1 to 60. I want to make a loop that iterates through each lbl_#.text adding some incremental value, let's say multiples of 2 for this question's theoretical purpose.

Something such that the end result would amount to the following:

lbl_1.text = "2"
lbl_2.text = "4"
lbl_3.text = "6"
...
lbl_60.text = "120"

I'm not sure how to access each of these labels through the coding side, I only know how to explicitly mention each label and assign a value :/

Upvotes: 3

Views: 12901

Answers (3)

Joel Coehoorn
Joel Coehoorn

Reputation: 416149

There are a few options here.

  • In this situation the labels will often have a common container, such as panel or groupbox control. In that case:

    Dim formLabels =  myContainerControl.Controls.OfType(Of Label)()
    For Each formLabel As Label In formLabels
       '...
    Next formLabel
    

    Of course, this mixes logical groups with visual groupings. Those two things don't always align well, so you can also...

  • Add them all to a Label array (or List(Of Label) or any other enumerable):

    Dim formLabels(60) As Label = {lbl_1, lbl_2, lbl_3 .... }
    
    For Each formLabel As Label in formLabels
        '...
    Next formLabel
    

    But sometimes that's more trouble than it's worth, even if you use a loop to create the collection, and so you can also

  • Use the .Name property (in conjunction with a naming convention to identify your desired controls):

    Dim formLabels = Controls.Where(Function(c) c.Name.StartsWith("lbl_"))
    For Each formLabel As Label In formLabels
        '...
    Next formLabel
    
  • Some combination of the above (for example, code in the form load event to create a list based on the name property).

Notice the actual For Each loop is exactly the same in all of those options. No matter what you do, get to the point where you can write a single expression to identify the label control, and then run a simple loop over the expression result.

This points to a final strategy: think in terms of binding to a data source. With a data source, your labels are created as part of a DataGridView, FlowLayoutPanel, or similar control. Then you can iterate the rows in the grid or panel.

Upvotes: 5

NoAlias
NoAlias

Reputation: 9193

If you don't know how many labels there are, one option is to use a Do Loop.

    Dim lblTarget As Label = Nothing
    Dim intCursor As Integer = 1
    Dim bolFirstIteration As Boolean = True

    Do Until lblTarget Is Nothing AndAlso Not bolFirstIteration

        If bolFirstIteration Then

            bolFirstIteration = False

        End If

        lblTarget = CType(Me.Controls("lbl_" & intCursor.ToString()), Label)

        If Not lblTarget Is Nothing Then

            lblTarget.Text = (intCursor * 2).ToString()

        End If

        intCursor += 1

    Loop

Upvotes: 1

deadlyvices
deadlyvices

Reputation: 883

Use the Controls collection:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles    MyBase.Load
        Dim i As Integer
       For i = 1 To 3
            Dim myLabel As Label = CType(Me.Controls("lbl_" & i), Label)
            myLabel.Text = ...whatever value you want to put here
        Next
    End Sub
End Class

Upvotes: 1

Related Questions