0
votes

Comment créer dynamiquement plusieurs contrôles au moment de l'exécution

J'essaie d'ajouter plusieurs étiquettes à un formulaire utilisateur au moment de l'exécution.

C'est pour les noms des joueurs d'un jeu de société; et jusqu'à ce que le jeu commence, le nombre de joueurs n'est pas connu. J'ai réussi à comprendre par moi-même comment utiliser la fonction de tableau dynamique pour créer la liste des joueurs. J'ai utilisé une boucle For ..... Next pour ajouter les noms des joueurs. Je pensais pouvoir faire cela pour ajouter les étiquettes au formulaire, mais cela n'en ajoute qu'une. Selon l'endroit où le nouveau type de contrôle est déclaré, il ajoute soit le premier joueur uniquement, soit le dernier joueur

Ce code produit une étiquette uniquement dans la zone de groupe, le dernier joueur

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

Celui-ci ne place que le premier joueur

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

J'ai essayé ceci dans la communauté vs 2015 et 2019

Où est-il ça va mal?


0 commentaires

3 Réponses :


0
votes

Vous les placez tous au même endroit

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

Utilisez votre index «z» pour les placer à différents endroits afin de pouvoir les voir

p >


0 commentaires

1
votes

D'après l'apparence du code, vous créez correctement les contrôles mais leur emplacement est le même pour tous, essentiellement, ils sont placés l'un de l'autre, le premier est caché avec le second, qui est masqué par le troisième.

La ligne

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

doit être modifiée pour placer les étiquettes à différents endroits.

Peut-être, quelque chose comme:

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

Cela alignera verticalement les étiquettes avec un écart de 25 entre elles


2 commentaires

Juste quelques secondes après, mais j'aime mieux votre réponse (changez simplement que 15 à 25, car la taille verticale du contrôle est 20)


J'ai modifié le deuxième exemple de mon code selon ce que vous avez suggéré et cela a fonctionné un charme. Cela n'a pas été le cas pour le premier, mais n'affichait toujours que le nom du joueur final; VB peut être étrange parfois lol. Tout va bien maintenant, merci beaucoup



0
votes

Pour moi, il est plus facile de contenir des contrôles dans un TableLayoutPanel puis d'ajouter le TLP à n'importe quelle collection de contrôles, telle qu'une GroupBox De cette façon, vous pouvez coupler une étiquette avec TextBox, par exemple. Voici un exemple de la façon dont vous pouvez créer des contrôles à partir d'un DataTable. Dans votre cas, vous n'auriez besoin que de 1 ColumnStyle pour les étiquettes, j'ai juste pensé que je vous montrerais une bonne pratique pour les futurs raccourcis. (J'utilise rarement le concepteur pour placer des contrôles)

    '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 commentaires