Ajout dynamique de contrôles [Résolu]

PhiChe 6 Messages postés lundi 5 février 2018Date d'inscription 28 février 2018 Dernière intervention - 5 févr. 2018 à 17:34 - Dernière réponse : PhiChe 6 Messages postés lundi 5 février 2018Date d'inscription 28 février 2018 Dernière intervention
- 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
Afficher la suite 

6 réponses

Répondre au sujet
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 5 févr. 2018 à 18:52
0
Utile
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

Commenter la réponse de cs_Le Pivert
PhiChe 6 Messages postés lundi 5 février 2018Date d'inscription 28 février 2018 Dernière intervention - 6 févr. 2018 à 11:01
0
Utile
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.
Commenter la réponse de PhiChe
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - Modifié par cs_Le Pivert le 6/02/2018 à 11:40
0
Utile
3
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!



PhiChe 6 Messages postés lundi 5 février 2018Date d'inscription 28 février 2018 Dernière intervention - 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.
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 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
PhiChe 6 Messages postés lundi 5 février 2018Date d'inscription 28 février 2018 Dernière intervention - 15 févr. 2018 à 13:46
Ok Merci.
Commenter la réponse de cs_Le Pivert

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.