Как динамически создать несколько элементов управления во время выполнения - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь добавить несколько ярлыков в пользовательскую форму во время выполнения

Это для имен игроков настольной игры;и до начала игры количество игроков не известно.Мне удалось выяснить для себя, как использовать функцию динамического массива для создания списка игроков.Я использовал цикл For ..... Next для добавления имен игроков.Я думал, что смогу сделать это, чтобы добавить метки в форму, но она добавляет только одну.В зависимости от того, где объявлен новый тип элемента управления, он добавляет либо только первого игрока, либо последнего игрока

. Этот код создает одну метку только внутри группового ящика, последний игрок

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim Players_Num As Integer = InputBox("Enter the number of players")
        Dim Players(Players_Num) As String
        Dim newText As New Label

        For i = 0 To Players_Num - 1
            Players(i) = InputBox("Enter player name")
        Next

        'This piece of code was jsut for me to test that I was successfully using a For...Loop
        'to add the players names, and will be deleted later on
        For x = 0 To Players_Num - 1
            MessageBox.Show(Players(x))
        Next

        For z = 0 To Players_Num - 1
            newText.Name = "txt" & Players(z)
            newText.Text = Players(z)
            newText.Size = New Size(170, 20)
            newText.Location = New Point(12 + 5, 12 + 5)
            GroupBox1.Controls.Add(newText)
        Next
    End Sub
End Class

На этом месте размещается только первый игрок

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim Players_Num As Integer = InputBox("Enter the number of players")
        Dim Players(Players_Num) As String

        For i = 0 To Players_Num - 1
            Players(i) = InputBox("Enter player name")
        Next

        'This piece of code was jsut for me to test that I was successfully using a For...Loop
        'to add the players names, and will be deleted later on
        For x = 0 To Players_Num - 1
            MessageBox.Show(Players(x))
        Next

        For z = 0 To Players_Num - 1
            Dim newText As New Label
            newText.Name = "txt" & Players(z)
            newText.Text = Players(z)
            newText.Size = New Size(170, 20)
            newText.Location = New Point(12 + 5, 12 + 5)
            GroupBox1.Controls.Add(newText)
        Next
    End Sub
End Class

Я пробовал это в сообществах 2015 и 2019 годов

Где все идет не так?

Ответы [ 3 ]

1 голос
/ 12 июня 2019

Судя по внешнему виду кода, вы правильно создаете элементы управления, но их расположение одинаково для всех из них, по сути, они располагаются друг над другом, первое скрыто со вторым, чтоскрыт с третьим.

Линия

newText.Location = New Point(12 + 5, 12 + 5)

нуждается в модификации для размещения меток в разных местах.

Возможно, что-то вроде:

newText.Location = New Point(12 + 5, 12 + (z * 25))

Это позволит выровнять метки по вертикали с промежутком 25 между ними

0 голосов
/ 12 июня 2019

Для меня проще содержать элементы управления в TableLayoutPanel, а затем добавить TLP в какую-либо коллекцию элементов управления, такую ​​как GroupBox Таким образом, например, вы можете связать Label с TextBox.Вот пример того, как вы можете создавать элементы управления из DataTable.В вашем случае вам понадобится только 1 ColumnStyle для меток, я просто подумал, что покажу вам хорошую практику для будущих ярлыков.(Я редко использую конструктор для размещения элементов управления)

    'Start test data
    Dim DtTable As New DataTable
    With DtTable
        Dim NewDtRow As DataRow = .NewRow
        For i As Integer = 0 To 25
            Dim DtCol As New DataColumn With {.ColumnName = "Col" & i, .DataType = GetType(String)}
            .Columns.Add(DtCol)
            NewDtRow(DtCol.ColumnName) = "Test" & i
        Next
        .Rows.Add(NewDtRow)
    End With
    'End test data

    Dim TLP1 As New TableLayoutPanel With {.Name = "TlpFields"}
    With TLP1
        .BorderStyle = BorderStyle.Fixed3D
        .CellBorderStyle = TableLayoutPanelCellBorderStyle.Inset
        .AutoScroll = True
        .AutoSize = True
        .RowStyles.Clear()
        .ColumnStyles.Clear()
        .Dock = DockStyle.Fill
        .ColumnCount = 2
        .ColumnStyles.Add(New ColumnStyle With {.SizeType = SizeType.AutoSize})
    End With

    For Each DtCol As DataColumn In DtTable.Columns
        With TLP1
            .RowCount += 1
            .RowStyles.Add(New RowStyle With {.SizeType = SizeType.AutoSize})

            'create labels
            .Controls.Add(New Label With {
                                          .Text = DtCol.ColumnName,
                                          .Anchor = AnchorStyles.Right}, 0, .RowCount)

            'create textboxs 
            Dim TxtBox As New TextBox With {
                                .Name = "TextBox" & DtCol.ColumnName,
                                .Size = New Size(170, 20),
                                .Anchor = AnchorStyles.Left}

            'add binding
            TxtBox.DataBindings.Add("Text", DtTable, DtCol.ColumnName)
            .Controls.Add(TxtBox, 1, .RowCount)
        End With
    Next

    Controls.Add(TLP1)
0 голосов
/ 12 июня 2019

Вы размещаете их все в одном месте

newText.Location = New Point(12 + 5, 12 + 5)

Используйте индекс 'z', чтобы разместить их в разных местах, чтобы их можно было увидеть

...