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?
3 Réponses :
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 >
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
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
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)