IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Afficher des UserControl dans une ListBox [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 17
    Par défaut Afficher des UserControl dans une ListBox
    Tout d'abord, bonjour à tous(tes).


    Je développe un petit programme dans lequel j'ai créé mes propres UserControl et notamment un contrôle de type "expander" qui se déplie et se replie (cf images ci-dessous).

    Mon U.C. collapsed:


    Mon U.C. expanded:



    Mon User Control fonctionne comme je le désire, cependant j'aimerais en disposer dans une liste verticale dynamique (régie par des boutons "+", "-", ...).

    J'ai d'abord cherché un contrôle correspondant au StackPanel d'ASP .NET, mais il semblerait que je ne puisse pas trouver ça en VB .NET.

    Tant pis, après avoir tenté une solution maison à base de FlowLayoutPanel puis de TableLayoutPanel.
    J'ai réussi à faire un bricolage pas terrible et qui ne me convenait pas (fonctionne, mais pas fonctionnel à l'utilisation et pas optimum).

    Je me suis donc rabattu sur le ListBox (ici, ajout d'un UserControl du même type que celui sur les images).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
        ' Ajoute un nouveau panneau d'option numériques repliable s'il n'existe pas déjà
        Private Function addANumberOption(ByVal panneauOption As cu_BoiteRepliable) As Boolean
     
            ' Vérifie que l'élément à entrer n'existe pas déjà
            For Each optionNombre As cu_BoiteRepliable In Me.LB_options.Controls
                If optionNombre.Titre.ToLower.Equals(panneauOption.Titre.ToLower) Then
                    Return False
                End If
            Next
     
            ' Crée un nouveau panneau repliable
            panneauOption.addControl(New cu_nombre)
     
            ' Ajoute le panneau dans la liste
            Me.LB_options.Items.Add(panneauOption)
     
            Return True
        End Function
    Or si mes éléments (= mes contrôles utilisateurs que j'ai précédemment créés) s'ajoutent correctement dans la collection des items du ListBox, l'affichage ne suit pas.


    Est-il possible d'afficher mon contrôle entièrement (c'est-à-dire pas uniquement une propriété ou un ensemble de propriétés, mais tel que je le vois) ou alors dois-je changer de méthode et trouver une autre solution ?


    Merci par avance pour vos réponses.

    Bonne journée/soirée, cordialement.

    Furior

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    le listbox ne peut afficher que des string
    la solution est le flowlayoutpanel, en mettant autoscroll à true qui fera apparaitre un ascenseur si nécessaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fp.controls.add(uctrl1)
    fp.break(uctrl1,true) ' pas sur de la syntaxe exacte, mais c'est pour dire d'aller à la ligne, sinon ca enchaine horizontalement + verticalement
    fp.controls.add(uctrl2)
    ...
    l'orientation doit etre définissable
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 17
    Par défaut
    Bonjour et merci pour ta réponse.

    le listbox ne peut afficher que des string
    Arf, je craignais cette réponse. Dommage.

    Je suis donc reparti sur le FlowLayoutPanel comme tu me l'as conseillé.
    Pour l'orientation j'ai trouvé ceci qui oriente de haut en bas (+ AutoScroll)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Me.myFlowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.TopDown
    Me.myFlowLayoutPanel.AutoScroll = True
    Actuellement j'ajoute donc comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myFlowLayoutPanel.Controls.Add(myUserControl)
    Les composants s'empilent dès qu'on en rajoute donc ça c'est bon, mais le soucis c'est qu'arrivé à la bordure du bas du FlowLayoutPanel au lieu de continuer vers le bas, ils reprennent une nouvelle colonne (cf image dessous)




    J'ai testé de rajouter le fameux Break, mais en fait le Break semble briser la disposition du Layout et donc il ne tient pas compte de l'orientation "haut/bas".
    Du coup les composants sont directement empilés de gauche à droite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myFlowLayoutPanel.SetFlowBreak(myUserControl, True)
    Quoi qu'il en soit, je te remercie et je continue de chercher.

    Bonne journée, cordialement

    Furior

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    change le flowdirection et utilise le break entre chaque ajout, ca fera ce que tu veux

    sinon il est possible de faire un exe en wpf au lieu de windows forms, et ca permet beaucoup plus de choses
    il est par exemple possible de mettre ce que l'on veut dans un listbox, y compris des classes non graphiques, et de décrire comment s'affiche cette classe non graphique
    genre je veux que pour telle classe il y ait un expander, le titre de l'expander doit être la propriété unetelle de ma classe, dans l'expander je veux un checkbox dont le titre et "format 1" et que la propriété coché de ce checkbox corresponde à la propriété unetelle de ma classe
    etc...
    et le fait de cocher le checkbox va modifier la propriété de la classe (binding)
    au final on ajoute des instances de cette classe non graphique dans le listbox et il se débrouille pour l'affichage, et on ne travaille dans le code qu'avec des classes métier
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut FlowLayetPanel ou TabLayoutPanel
    bonjour furior
    comme l'as dit Pol63 tu peux utiliser un FlowLayetPanel et si tu la disposition verticale uniquement il me semble que TabLayoutPanel convient car il permet d'ajouter de haut en bas autant de lignes ,redimensinnement auto et scrollbars :
    code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    Public Class Form2
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     
            'Permet d'ajouter autant de lignes que souhaite
            Me.TableLayoutPanel1.GrowStyle = TableLayoutPanelGrowStyle.AddRows
            'AutoScroll active
            Me.TableLayoutPanel1.AutoScroll = True
            For i As Integer = 0 To 9
     
     
                Dim btn As Button = New Button
                btn.Name = "button" & (i + 1).ToString
                btn.Text = "button" & (i + 1).ToString
                btn.BackColor = Color.GreenYellow
                btn.Dock = DockStyle.Fill
                Me.TableLayoutPanel1.Controls.Add(btn)
            Next
            'Redimensionement automatique suivant taille du controle ajoute
            For i As Integer = 0 To Me.TableLayoutPanel1.RowCount - 1
                Me.TableLayoutPanel1.RowStyles(0).SizeType = SizeType.AutoSize
            Next
     
        End Sub
    End Class
    bon code....

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 17
    Par défaut
    Je viens vous faire un ultime retour avant passage en résolu:

    - Tout d'abord Pol63:
    change le flowdirection et utilise le break entre chaque ajout, ca fera ce que tu veux
    J'ai donc laissé le FlowDirection du concepteur par défaut (LeftToRight) et ajouté le break: ça fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Dim myFlowLayoutPanel As New FlowLayoutPanel
    ...
    ' Flux de disposition gauche vers droite + autoScroll
    myFlowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.LeftToRight
    myFlowLayoutPanel.AutoScroll = True
     
    For i As Integer = 0 To 2
            Dim myButton As New Button With {.Name = "Button" + i, .Text = "Button" + i}
            ' Ajout d'un bouton suivi d'une rupture
            myFlowLayoutPanel.Controls.Add(myButton)
            myFlowLayoutPanel.SetFlowBreak(myButton, True)
    Next

    - Ensuite MABROUKI:
    Idem, j'ai testé et ça fonctionne.

    Me voilà donc en possession de deux méthodes fonctionnelles. Merci à vous deux pour vos réponses éclairées.
    Je passe en résolu

    Bonne journée.

    Cordialement, Furior

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Macro pour afficher des données dans une listbox
    Par LaurentIA dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/08/2012, 17h56
  2. [XL-2002] Afficher des arrondis dans une listBox
    Par drics dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/09/2010, 14h46
  3. Afficher des données dans une ListBox
    Par momoh dans le forum VB.NET
    Réponses: 4
    Dernier message: 09/03/2010, 19h22
  4. Comment afficher des JPEG dans une application Delphi ?
    Par Bouguennec dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/09/2005, 21h18
  5. [C/C++] afficher des doubles dans une message box
    Par lalaurie40 dans le forum MFC
    Réponses: 1
    Dernier message: 24/05/2005, 14h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo