Search code examples
vb.netpicturebox

Accessing multiple PictureBoxes (or any form control) in Visual Basic?


So I'm making a game in VB for learning purposes and now I'm struggling with this problem:

I'm trying to do a For loop that draws the level map. However, I just can't seem to figure out it. This is an example of what I'm trying to do:

For index as integer = 1 to 192
    PictureBox(index).Image = bg(map(x,y)) 'this is causing me problems
    x=x+1
    if x=16 then
        x=0
        y=y+1
    End If
Next

But since PictureBox(index).Image doesn't seem to be the correct answer, it simply throws me an error.

Is there any way to do this?

EDIT:

Shortly, I need to set PictureBox.Image's from 1 to 192 like this without having 192 lines of code:

PictureBox1.Image = bg(map(0,0))
PictureBox2.Image = bg(map(1,0))
PictureBox3.Image = bg(map(2,0))
PictureBox4.Image = bg(map(3,0))
'etc....

Instead I wan't to set them in a For loop. I don't want to have extra lines of code.

EDIT2:

The PictureBoxes are added in the editor.


Solution

  • In the designer set the property Tag of each PictureBox to the string value composed by the x and y required to pass to the map function

    For example:

    • PictureBox1 should have the Tag property set to "0,0"
    • PictureBox2 set the Tag property to "1,0",
    • ....
    • PictureBox17 will have the Tag property set to "0,1"

    and so on until you have mapped all your pictureboxes with the correct values.

    Then your code could be changed to

    ' Assuming the PictureBox are all childs of the Form
    For Each pic in Me.Controls.OfType(Of PictureBox)()
    
        Dim tag = pic.Tag
    
        ' You could omit this check if you have only the pictureboxes
        ' set with a valid Tag property 
        if Not string.IsNullOrEmpty(tag) Then
           Dim xyCoords = tag.ToString().Split(","c)
           pic.Image = bg(map(Convert.ToInt32(xyCoords(0), 
                              Convert.ToInt32(xyCoords(1))))
        End if
    Next