Ajout dynamique de contrôles

Résolu
PhiChe Messages postés 6 Date d'inscription lundi 5 février 2018 Statut Membre Dernière intervention 28 février 2018 - 5 févr. 2018 à 17:34
PhiChe Messages postés 6 Date d'inscription lundi 5 février 2018 Statut Membre Dernière intervention 28 février 2018 - 15 févr. 2018 à 13:46
Bonjour,
Je souhaite créer des contrôles de manière dynamique. J'ai le même résultat avec des buttons ou des labels, à savoir des contrôles tronqués au-delà d'une certaine taille ou plutôt d'un certain espacement des contrôles.
Je m'explique : si je choisis de faire se chevaucher les contrôles, ils s'affichent tous mais évidemment, ce n'est pas satisfaisant. Au delà d'un certain écartement, seuls les 2, 3 ou 4 premiers contrôles s'affichent. Par exemple, je n'aurai qu'une partie du 4° contrôle et les contrôles suivants ne s'afficheront pas.
J'ai tenté la même chose en insérant les contrôles dans un panel, mais le résultat est identique.
De plus, j'ai le même souci en les rangeant l'un à côté de l'autre ou l'un au-dessus de l'autre.
VB ne génère pas d'erreur.
Bizarre autant qu'étrange !
Merci à ceux qui voudront bien me donner un coup de main.
Voici le code :
Public Class frmCartes10Par5
    Dim TableauNombres As Panel = New Panel
    Dim btnNombre() As Button

    Private Sub frmCartes10Par5_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        Me.Controls.Add(TableauNombres)
        For i As Integer = 0 To 10
            ReDim Preserve btnNombre(i)
            btnNombre(i) = New Button
            With btnNombre(i)
                .Font = New System.Drawing.Font("Trebuchet", 18, FontStyle.Bold)
                .TextAlign = ContentAlignment.BottomCenter
                .Text = i.ToString
                .BackColor = Color.Blue
                .ForeColor = Color.White
                .AutoSize = True
                If i > 0 Then
                    .Left = btnNombre(i - 1).Left + btnNombre(i - 1).Width
                Else
                    .Left = 10
                End If
                .Top = 50
            End With
            AddHandler btnNombre(i).Click, AddressOf btnNombre_Click
            Me.TableauNombres.Controls.Add(btnNombre(i))
        Next i
    End Sub

    Private Sub btnNombre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim Index As Integer = TableauNombres.Controls.IndexOf(sender)
        Me.Text = "Clic sur Bouton " & Index
    End Sub
End Class

3 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
5 févr. 2018 à 18:52
Bonjour,

Dans cet exemple ceux sont des PictureBox, mais tu peux l'adapter a des boutons:

http://codes-sources.commentcamarche.net/forum/affich-10061213-decouper-une-image-en-plusieurs-parties-puis-la-re-assembler#14

0
PhiChe Messages postés 6 Date d'inscription lundi 5 février 2018 Statut Membre Dernière intervention 28 février 2018
6 févr. 2018 à 11:01
Normalement, je ne devrais pas avoir de souci d'affichage, sauf erreur de ma part. Voici l'image du résultat sur mon écran pour une explication plus claire :

Comme vous le voyez, le Button "2" est tronqué et les Buttons "3" à "9" ne sont pas affichés.
Si je choisis de les disposer verticalement, j'ai le même souci : à partir d'une certaine zone, il y a effacement de tout ou partie des Buttons.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
Modifié le 6 févr. 2018 à 11:40
Un exemple avec une adaptation du lien que je t'ai donné:

Mettre dans un Form de 545 x 260 ce code:

Option Strict On
Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim j As Integer
        Dim vignette As Integer
        Dim x, y, diff, dify As Int32
        vignette = 100
        Dim TableauNombres As Panel = New Panel
        Me.Controls.Add(TableauNombres)
        TableauNombres.Size = New Size(500, 200) 'a adapter
        TableauNombres.Location = New Point(10, 10) 'a adapter
        For j = 1 To 10
            Dim btnNombre As New Button
            With btnNombre
                .Font = New System.Drawing.Font("Trebuchet", 18, FontStyle.Bold)
                .TextAlign = ContentAlignment.BottomCenter
                .Text = "BTN" & j
                .Name = "Monbouton " & j
                .BackColor = Color.Blue
                .ForeColor = Color.White
                .AutoSize = True
            End With
            btnNombre.SetBounds(x, y, vignette, vignette)
            x += vignette
            'vérifier s'il ya suffisamment d'espace dans l'axe x pour ajouter un button
            If x >= TableauNombres.Width Or (x + vignette) > TableauNombres.Width Then
                diff = TableauNombres.Width - x
                'S'il n'y a pas assez d'espace, commencer une nouvelle ligne ci-dessous
                y += vignette
                x = 0
            End If
            If ((y + vignette) > TableauNombres.Height) Then
                dify = TableauNombres.Height - y
            End If
            AddHandler btnNombre.Click, AddressOf btnNombre_Click
            TableauNombres.Controls.Add(btnNombre)
        Next j
    End Sub
    Private Sub btnNombre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        ' On récupère le contrôle cliqué ...
        Dim Index As Button = DirectCast(sender, Button)
        Me.Text = Index.Text
        MsgBox(Index.Name)
    End Sub
End Class


Ensuite en jouant sur les dimensions du Panel tu pourras mettre les buttons a ta convenance!



0
PhiChe Messages postés 6 Date d'inscription lundi 5 février 2018 Statut Membre Dernière intervention 28 février 2018
7 févr. 2018 à 16:27
Parfait : ça fonctionne.
Venant de VB6, je suis confronté à pas mal de changements dans VB Net qui me laissent parfois sans solution immédiate (je travaillais beaucoup avec les index de contrôles).
Merci d'avoir passé du temps pour résoudre mon problème.
A propos, sais-tu comment signifier que le problème est résolu sur le site ? Je ne trouve pas la commande sur la page.
A bientôt.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
7 févr. 2018 à 16:35
J'avais repris l'ancien code avec des PictureBox carrées, mais si tu veux des buttons rectangulaires, il suffit de modifier comme ceci:

  Dim j As Integer
        ' Dim vignette As Integer
        Dim largeur, hauteur As Integer
        Dim x, y, diff, dify As Int32
        '  vignette = 100
        largeur = 100
        hauteur = 50
        Dim TableauNombres As Panel = New Panel
        Me.Controls.Add(TableauNombres)
        TableauNombres.Size = New Size(600, 200) 'a adapter
        TableauNombres.Location = New Point(10, 10) 'a adapter
        For j = 1 To 10
            Dim btnNombre As New Button
            With btnNombre
                .Font = New System.Drawing.Font("Trebuchet", 18, FontStyle.Bold)
                .TextAlign = ContentAlignment.BottomCenter
                .Text = "BTN" & j
                .Name = "Monbouton" & j
                .BackColor = Color.Blue
                .ForeColor = Color.White
                .AutoSize = True
            End With
            btnNombre.SetBounds(x, y, largeur, hauteur)
            x += largeur + 20
            'vérifier s'il ya suffisamment d'espace dans l'axe x pour ajouter une image
            If x >= TableauNombres.Width Or (x + largeur) > TableauNombres.Width Then
                diff = TableauNombres.Width - x
                'S'il n'y a pas assez d'espace, commencer une nouvelle ligne ci-dessous
                y += hauteur + 30
                x = 0
            End If
            If ((y + largeur) > TableauNombres.Height) Then
                dify = TableauNombres.Height - y
            End If
            AddHandler btnNombre.Click, AddressOf btnNombre_Click
            TableauNombres.Controls.Add(btnNombre)
        Next j


Pour Résolu, c'est la roue crantée en haut à droite

@+ Le Pivert
0
PhiChe Messages postés 6 Date d'inscription lundi 5 février 2018 Statut Membre Dernière intervention 28 février 2018
15 févr. 2018 à 13:46
Ok Merci.
0
Rejoignez-nous