0

我正在使用动态创建的控件,需要在运行时检索有关控件的信息。

If IsLoaded <> "free" Then
        flow_display.Controls.Clear()
        For x As Integer = 0 To populate.Count - 1
            If populate(x).parentID = 2 Then
                Dim NewPicBox As PictureBox = New PictureBox
                NewPicBox.Size = New System.Drawing.Size(697, 50)
                NewPicBox.ImageLocation = pw_imgLink & populate(x).imageID

                AddHandler NewPicBox.Click, AddressOf catWindow
                flow_display.Controls.Add(NewPicBox)
            End If
        Next
        IsLoaded = "free"

    End If
End Sub

在这里,当用户单击适当的标签时,我将创建控件。现在 catWindow 子是空的。我需要弄清楚单击了哪个按钮并找出它在填充列表中的位置。我已经尝试了一些事情,从我从其他问题中读到的内容似乎找不到任何帮助。谢谢 :)

4

1 回答 1

1

要找出按下的是哪个 PictureBox,您的 catWindow Sub 应如下所示:

Public Sub catWindow(ByVal sender As Object, ByVal e As EventArgs)
    Dim box As PictureBox = TryCast(sender, PictureBox)
    If box Is Nothing Then Exit Sub

    'Now "box" refers to the PictureBox that was pressed
    '...
End Sub

如果要在填充列表中找到它的位置,则需要遍历列表,直到找到匹配框。您还可以抢占 PictureBox 上没有做任何其他事情的属性,并使用它来存储索引。旧的表单工具曾经有一个 .Tag 属性,特别是对于这种事情。但实际上,这样做的需要对我来说就像一个设计缺陷。

FWIW,我会像这样重写你的原始样本:

If IsLoaded <> "free" Then

    flow_display.SuspendLayout()
    flow_display.Controls.Clear()

    For Each box As PictureBox In populate
                        .Where(Function(p) p.parentID = 2)
                        .Select(Function(p) New PictureBox() With {
                             .Size = New System.Drawing.Size(697, 50),
                             .ImageLocation pw_imgLink & p.imageID })

        AddHandler box.Click, AddressOf catWindow
        flow_display.Controls.Add(box)
    Next box

    flow_display.ResumeLayout()
    IsLoaded = "free"
End If
于 2012-11-08T21:19:06.793 回答