Search code examples
vb.netvariablespicturebox

Can I use variables to control which PictureBox I am using?


Is there a way that I can use a variable to control which PictureBox I am using in Visual Basic?

I.e.:

CurrentNumber = 1    
PictureBox(CurrentNumber).backcolour = backcolour

Solution

  • You can use the Me.Controls(String) indexer. It lets you specify the name (as a string) of the control you want to access, thus you can dynamically access a picture box by concatenating the string "PictureBox" with a number.

    Dim TargetPictureBox As PictureBox = TryCast(Me.Controls("PictureBox" & CurrentNumber), PictureBox)
    
    'Verifying that the control exists and that it was indeed a PictureBox.
    If TargetPictureBox IsNot Nothing Then
        TargetPictureBox.BackColor = Color.Red
    End If
    

    Alternatively, to save processing power by avoiding looping through the entire control collection every time you can call the OfType() extension on Me.Controls, storing the result in an array sorted by the controls' names. That way it'd only have to iterate the control collection once.

    'Class level - outside any methods (subs or functions).
    Dim PictureBoxes As PictureBox() = Nothing
    
    'Doesn't necessarily have to be done in a button, it's just an example.
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If PictureBoxes Is Nothing Then
            PictureBoxes = Me.Controls.OfType(Of PictureBox).OrderBy(Function(p As PictureBox) p.Name).ToArray()
        End If
    
        'NOTE: CurrentNumber - 1 is necessary when using an array!
        PictureBoxes(CurrentNumber - 1).BackColor = Color.Red
    End Sub
    

    NOTE: This solution will only work properly if all your picture boxes are named "PictureBox1", "PictureBox2", etc. If you suddenly skip a number ("PictureBox3", "PictureBox5", "PictureBox6") then PictureBoxes(CurrentNumber - 1) for CurrentNumber = 5 would return PictureBox6 rather than PictureBox5.