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 に答える