Marcx
Marcx

Reputation: 6836

VB.NET dynamic use of form controls

I have 10 labels named lbl1, lbl2, ... lbl10

I'd like to change their propriety (using a cicle) with the cicle index

for i as integer=1 to 10 step 1
    lbl (i) = PROPRETY 'I know this is wrong but it's what I would do...
end for

I'm using a workaround, but I'm looking for a better way..

    Dim exm(10) As Label
    exm(1)=lbl1
    exm(2)=lbl2
    ...
    exm(10)=lbl10

    for i as integer=1 to 10 step 1
        exm (i) = PROPRETY 
    end for

Upvotes: 0

Views: 1088

Answers (4)

AMissico
AMissico

Reputation: 21684

You work around is actually the recommended technique. You may want to use a List(Of Label) and a For...Each statement. This will eliminate the hard-coding and ease maintenance.

Upvotes: 1

Paulo Santos
Paulo Santos

Reputation: 11587

Taking M.A. Hanin's answer as a base you could simply do something like:

(From l in Me.Controls _
Where RegEx.IsMatch(l.Name, "^lbl[0-9]+") AndAlso TypeOf l is Label
Order By l.Name).ForEach(Function(l) SetPropertyForLabel(l))

Sub SetPropertyForLabel(lbl as Label)
   ' Do some stuff '
   lbl.Text = lbl.Name
End Sub

This way you can use a regular expression to filter the name of tour labels (the one provided matches the pattern you gave on the O.P.) and perform the action on a custom method.

Upvotes: 1

M.A. Hanin
M.A. Hanin

Reputation: 8084

If the labels are contained in a Form or some other container, you can use a query similiar to this:

Dim myLabels = (From g As Label In Me.Controls Select g _
                Where Mid(g.Name, 1, 3) = "lbl" Order By g.Name)

Then iterate through the collection, applying your property.

Upvotes: 1

driis
driis

Reputation: 164341

Your "workaround" is a fine way to do it. You need to have your controls in some kind of collection, in order to iterate through them.

Perhaps you can use array initializers in order to initialize the array more cleanly (less code): Object and array initializers in VB .NET

You could go through the Controls collection, and do your action for each Label you find, but that is probably not what you want - since that would get you all of the labels on the form.

Upvotes: 2

Related Questions