3

在 Visual Basic 2010 表单应用程序中,我有以下代码片段:

For Each ctlControl In Me.Panel1.Controls
    If TypeName(ctlControl) = "PictureBox" Then
        ctlControl.image = Nothing
    End If
Next ctlControl

我的问题是当它遍历控件时,它不是从左上角控件开始的,而且它似乎以随机顺序遍历每个图片框。

如何控制接下来更新哪个图片框的顺序。是否有类似于选项卡索引(在 VB 6 中)的属性,我可以操纵它来控制我的循环更新图片框的顺序?

4

4 回答 4

2

作为一种更正确和确定的方式,我会获取每个图片框,保留它们的句柄和位置,然后根据它们的位置对它们进行排序。现在它们可以使用了。这是一个例子:

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 用于下一个,依此类推...

编辑:使用 Tag 属性,正如 John Bustos 所建议的那样,而不是名称是一个更容易和更好的主意。因此,在不迷失名称的情况下,您可以根据您定义的标签对图片​​框进行排序。

于 2013-01-02T22:18:32.550 回答
0

控件的顺序由它们添加到面板的顺序决定,而不是制表位索引。您可以通过仔细重新组织表单设计器文件中添加到面板的顺序来更改它,但我不推荐这样做。

于 2013-01-02T22:14:30.887 回答
0

正如其他一些人所说,您可以使用可能是最佳镜头的 TAG 属性,当您动态创建图片框时,使用计数器并将计数器值添加到 TAG 属性。如果您手动添加图片框,则只需从左上​​角开始向右工作,然后在每个图片的 TAG 属性字段中添加一个值,从 1 开始,每次递增 1,一直持续到该行完成,然后继续与下一行。

最后,当您准备好循环浏览图片框时,只需按照以下模式操作即可。

'Calc number of picture boxes
For Each ctlControl In Me.Panel1.Controls
  If TypeName(ctlControl) = "PictureBox" Then
    Counter = Counter + 1
  End If
Next ctlControl
ThisBox = 1
Do
  For Each ctlControl In Me.Panel1.Controls
    If TypeName(ctlControl) = "PictureBox" Then
      If CInt(ctlControl.Tag) = ThisBox Then 
        CLEAR-YOUR-IMAGE-HERE
        ThisBox = ThisBox + 1
      End If
    End If
  Next ctlControl
Loop Until ThisBox = Counter

注意:重要的是您放置在 TAG 属性中的数字是连续的,否则您将永远卡在 DO-LOOP 中!!!

于 2013-01-03T07:32:04.240 回答
0

PictureBox 控件有一个 Text 属性,您可以使用它来代替 Tag。

它不会出现在 Intellisense 中,因为它是基础设施属性,但它就在那里。

http://msdn.microsoft.com/en-us/library/hc9k45f4(v=vs.110).aspx

(我想评论 Zaf Khan 的回答,但我还没有代表。)

于 2014-10-28T02:11:19.293 回答