在 Visual Basic 2010 表单应用程序中,我有以下代码片段:
For Each ctlControl In Me.Panel1.Controls
If TypeName(ctlControl) = "PictureBox" Then
ctlControl.image = Nothing
End If
Next ctlControl
我的问题是,当它循环遍历控件时,它不是从左上角的控件开始,而且它似乎以随机顺序遍历每个图片框。
如何控制接下来更新哪个图片框的顺序。是否有类似于选项卡索引(在 VB 6 中)的属性,我可以操纵它来控制循环更新图片框的顺序?
最佳答案
作为一种更正确、更可靠的方法,我会获取每个图片框,保留它们的句柄和位置,然后根据它们的位置对它们进行排序。现在它们可以使用了。这是一个例子:
Public Class Form1
Structure Pbox
Dim handle As IntPtr
Dim top As Integer
Dim left As Integer
End Structure
Dim pboxlist As New List(Of Pbox)
Sub ClearImages()
pboxlist.Clear()
For Each c As Control In Me.Controls
If TypeName(c) = "PictureBox" Then
Dim x As New Pbox
x.top = c.Top
x.left = c.Left
x.handle = c.Handle
End If
Next
pboxlist.OrderByDescending(Function(a) a.top).ThenByDescending(Function(a) a.left)
For Each item In pboxlist
Dim x As PictureBox = PictureBox.FromHandle(item.handle)
x.Image = Nothing
Next
End Sub
End Class
另一种方法是使用良好的命名,以便您可以使用它们的名称对它们进行排序。例如,如果排序,PictureBox1 将排在 PictureBox2 之前。所以你应该使用 PictureBox1 作为最上面和最左边的一个,使用 PictureBox2 作为下一个,依此类推...
编辑:按照 John Bustos 的建议,使用 Tag 属性代替名称是一个更简单、更好的主意。因此,您可以根据您定义的标签对图片框进行排序,而不会迷失在名称中。
关于vb.net - 在 Visual Basic 2010 中动态循环图片框控件似乎不遵循任何顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14129652/