如何将Timer.Tick中动态创建的PictureBox添加到数组以便后续引用?
解决方案:用List存储动态创建的PictureBox
没问题,想要后续方便引用这些动态生成的PictureBox,用List(Of PictureBox)是最适合的选择——比固定长度的数组灵活太多,毕竟你是在Timer里持续创建控件嘛。
步骤1:先声明全局可用的List
在你的Form类的最顶部(不要放在Timer事件里)声明这个List,这样整个窗体的代码都能访问到它:
' 放在Form类的字段区域 Private pictureBoxList As New List(Of PictureBox)
步骤2:创建控件时添加到List里
修改你Timer.Tick事件里的代码,在添加完控件到窗体后,把它塞进List:
Dim lineb As New PictureBox lineb.Size = New Size(24, 24) lineb.BackColor = Color.FromArgb(0, 192, 192) lineb.Location = New Drawing.Point(xb, yb) Controls.Add(lineb) lineb.Name = "lineb" + CStr(creatorb) creatorb += 1 ' 关键:把新创建的PictureBox添加到List中 pictureBoxList.Add(lineb)
步骤3:后续怎么引用这些控件?
有了这个List,你可以轻松做各种操作:
- 按索引访问:比如要获取第3个创建的控件(索引从0开始):
Dim targetPB As PictureBox = pictureBoxList(2) ' 然后就可以修改它的属性,比如移动位置 targetPB.Location = New Point(100, 100) - 按名称查找:如果你记得控件的名字(比如
lineb5),可以用LINQ快速定位:Dim targetPB As PictureBox = pictureBoxList.FirstOrDefault(Function(pb) pb.Name = "lineb5") If targetPB IsNot Nothing Then ' 找到啦,做你想做的操作 targetPB.BackColor = Color.Yellow End If - 遍历所有控件:比如一次性修改所有PictureBox的背景色:
For Each pb As PictureBox In pictureBoxList pb.BackColor = Color.Red Next
小提示
如果之后需要删除某个控件,记得同时从List和窗体的Controls集合里移除,避免内存泄漏:
' 比如移除第一个控件 Dim pbToRemove As PictureBox = pictureBoxList(0) Controls.Remove(pbToRemove) pictureBoxList.Remove(pbToRemove) ' 释放资源 pbToRemove.Dispose()
内容的提问来源于stack exchange,提问作者Nick Charters
相关产品推荐
相关产品推荐

