OVH Cloud OVH Cloud

Ajouter contrôles dynamiquement

15 réponses
Avatar
Olivier57b
Salut,

je voudrais ajouter des contrôles (label,listbox) dynamiquement, mais je
voudrais les créer dans une procédure; le problème c'est qu'alors ces
contrôles ne sont accessibles que dans la procédure précédente.Comment faire
pour qu'ils soient accessibles partout (et notamment dans le module Form1, où
VS placera les procédures associées aux événements)?

Merci, Olivier57b.

5 réponses

1 2
Avatar
Megaten
Tiens voila un code qui marche, il te reste la boucle à
mettre au point
Dans ton exemple tu ajoutes toujours le meme et unique objet...



Une form avec un bouton
Public Class Form1
Inherits System.Windows.Forms.Form (1)
Dim idx As Integer = 0
Dim LeftPos As Integer = 10
Dim TopPos As Integer = 10

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load



End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
idx = idx + 1
Dim MyLabel As New Label '(2)
'Position the new label
With MyLabel
.Text = "Dynamique label " + CStr(idx)
.BackColor = Color.Bisque
.Left = LeftPos
.Top = TopPos + 30
TopPos = TopPos + 30
.Width = 160
.Height = 20
End With
Me.Controls.Add(MyLabel) '(3)

End Sub
End Class


Olivier57b a écrit :
Voilà le code:

L'idée, c'est d'afficher un nombre variable de labels(et aussi, ailleurs,
des textbox) dans cette procédure, en fonction de CatPar qui est la chaîne à
afficher, et de CatCNbPar qui est l'indice de la chaîne, et qui sert à
désigner l'endroit où afficher le label.Je pense que VB bloque car tous les
labels qui sont crées sont les mêmes: il n'a plus le moyen de les
indentifier.Mais retournons au code:

Sub AfficheCatC(ByVal CatCPar As String, ByVal CatCNbPAr As Integer)

pnlCat.Controls.Add(New Label)


Dim ptSupG As New Point(68 + 232 * (CatCNbPAr - 1), 182)
' NB : ne pas oublier le -1
' Il faut aussi redimensionner le formulaire
pnlCat.Controls.Item(CatCNbPAr - 1).Location = ptSupG
Dim FonteFam1 As New FontFamily("Prime Minister of Canada")
Dim Police1 As New Font(FonteFam1, 20, FontStyle.Regular,
GraphicsUnit.Pixel)
pnlCat.Controls.Item(CatCNbPAr - 1).Font = Police1
pnlCat.Controls.Item(CatCNbPAr - 1).Text = CatCPar
Controls.Add(pnlCat.Controls.Item(CatCNbPAr - 1))


End Sub

Merci pour votre aide, Olivier57b.



Avatar
Olivier57b
Megaten,

Je te remercie pour le programme que tu m'as donné.Je l'ai essayé et cela
marche au poil. Je vais essayer de transposer dans mon programme, si cela ne
marche pas, je te ferai savoir pourquoi mais je crois que maintenant, je suis
sur la bonne piste.

Merci encore de m'avoir aidé!

Olivier57b.
Avatar
Olivier57b
Megaten,

J'ai (presque) réussi ma procédure, mais un nouveau problème est
apparu.Voici la procédure tout d'abord:

Sub AffichePdt(ByVal CatCNbPAr As Integer, ByVal PdtNbPar As Integer, ByVal
pdtPar As String)


Dim FonteFam1 As New FontFamily("Georgia")
Dim Police1 As New Font(FonteFam1, 10, FontStyle.Regular,
GraphicsUnit.Pixel)

'checkBox
Dim myChkBox As New CheckBox()
With myChkBox
'Pour le nom, on commence par Ckb 1.1
.Name = "Ckb " & CType(CatCNbPAr, String) & "." & CType(PdtNbPar
+ 1, String)
.Text = ""
.Left = 26 + 232 * (CatCNbPAr - 1)
'PdtNbPar commence à 1
.Top = 226 + 20 * PdtNbPar
.Font = Police1
'.Width = 160
'.Height = 20
End With
Me.Controls.Add(myChkBox)
Refresh()

'label du pdt
Dim MyLabel As New Label()
'Position the new label
With MyLabel
.Name = "lbl " & CType(CatCNbPAr, String) & "." & CType(PdtNbPar
+ 1, String)
.Text = pdtPar
.Left = 47 + 232 * (CatCNbPAr - 1)
.Top = 226 + 20 * PdtNbPar
.Font = Police1
'.Width = 160
'.Height = 20
End With
Me.Controls.Add(MyLabel)
Refresh()

Les paramètres sont les coordonnées CatCNbPar et PdtNbPar, et pour chaque
coordonnée, j'affiche une checkBox, un label (et dans la suite de la
procédure, deux textBox mais cela importe peu), label dont la chaîne est
pdtPar.Voici mon problème: le code ci-dessus n'affiche que les checkBox, et
pas les labels. Par contre, si j'enlève les checkBox, les lavels s'affichent
correctement... Je n'y comprends rien. Au total, il y a une dizaine de
contrôles dans Me.Controls; ça n'est pas beaucoup...

Avez-vous une idée?


> Merci pour votre aide, Olivier57b.
>



Avatar
Megaten
Donne un couleur au background de ton label
.BackColor = Color.Bisque
et tu le verras.
Par contre il n'y a rien dedans

Olivier57b a écrit :
Megaten,

J'ai (presque) réussi ma procédure, mais un nouveau problème est
apparu.Voici la procédure tout d'abord:

Sub AffichePdt(ByVal CatCNbPAr As Integer, ByVal PdtNbPar As Integer, ByVal
pdtPar As String)


Dim FonteFam1 As New FontFamily("Georgia")
Dim Police1 As New Font(FonteFam1, 10, FontStyle.Regular,
GraphicsUnit.Pixel)

'checkBox
Dim myChkBox As New CheckBox()
With myChkBox
'Pour le nom, on commence par Ckb 1.1
.Name = "Ckb " & CType(CatCNbPAr, String) & "." & CType(PdtNbPar
+ 1, String)
.Text = ""
.Left = 26 + 232 * (CatCNbPAr - 1)
'PdtNbPar commence à 1
.Top = 226 + 20 * PdtNbPar
.Font = Police1
'.Width = 160
'.Height = 20
End With
Me.Controls.Add(myChkBox)
Refresh()

'label du pdt
Dim MyLabel As New Label()
'Position the new label
With MyLabel
.Name = "lbl " & CType(CatCNbPAr, String) & "." & CType(PdtNbPar
+ 1, String)
.Text = pdtPar
.Left = 47 + 232 * (CatCNbPAr - 1)
.Top = 226 + 20 * PdtNbPar
.Font = Police1
'.Width = 160
'.Height = 20
End With
Me.Controls.Add(MyLabel)
Refresh()

Les paramètres sont les coordonnées CatCNbPar et PdtNbPar, et pour chaque
coordonnée, j'affiche une checkBox, un label (et dans la suite de la
procédure, deux textBox mais cela importe peu), label dont la chaîne est
pdtPar.Voici mon problème: le code ci-dessus n'affiche que les checkBox, et
pas les labels. Par contre, si j'enlève les checkBox, les lavels s'affichent
correctement... Je n'y comprends rien. Au total, il y a une dizaine de
contrôles dans Me.Controls; ça n'est pas beaucoup...

Avez-vous une idée?


Merci pour votre aide, Olivier57b.







Avatar
Megaten
Par defaut label.backcolor doit prendre la couleur de son container.
Comme il n'y a pas de text le label apparait ton sur ton donc rien de visible.
Michel

Olivier57b a écrit :
Megaten,

J'ai (presque) réussi ma procédure, mais un nouveau problème est
apparu.Voici la procédure tout d'abord:

Sub AffichePdt(ByVal CatCNbPAr As Integer, ByVal PdtNbPar As Integer, ByVal
pdtPar As String)


Dim FonteFam1 As New FontFamily("Georgia")
Dim Police1 As New Font(FonteFam1, 10, FontStyle.Regular,
GraphicsUnit.Pixel)

'checkBox
Dim myChkBox As New CheckBox()
With myChkBox
'Pour le nom, on commence par Ckb 1.1
.Name = "Ckb " & CType(CatCNbPAr, String) & "." & CType(PdtNbPar
+ 1, String)
.Text = ""
.Left = 26 + 232 * (CatCNbPAr - 1)
'PdtNbPar commence à 1
.Top = 226 + 20 * PdtNbPar
.Font = Police1
'.Width = 160
'.Height = 20
End With
Me.Controls.Add(myChkBox)
Refresh()

'label du pdt
Dim MyLabel As New Label()
'Position the new label
With MyLabel
.Name = "lbl " & CType(CatCNbPAr, String) & "." & CType(PdtNbPar
+ 1, String)
.Text = pdtPar
.Left = 47 + 232 * (CatCNbPAr - 1)
.Top = 226 + 20 * PdtNbPar
.Font = Police1
'.Width = 160
'.Height = 20
End With
Me.Controls.Add(MyLabel)
Refresh()

Les paramètres sont les coordonnées CatCNbPar et PdtNbPar, et pour chaque
coordonnée, j'affiche une checkBox, un label (et dans la suite de la
procédure, deux textBox mais cela importe peu), label dont la chaîne est
pdtPar.Voici mon problème: le code ci-dessus n'affiche que les checkBox, et
pas les labels. Par contre, si j'enlève les checkBox, les lavels s'affichent
correctement... Je n'y comprends rien. Au total, il y a une dizaine de
contrôles dans Me.Controls; ça n'est pas beaucoup...

Avez-vous une idée?


Merci pour votre aide, Olivier57b.







1 2