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 :

Ajout d'un ComboBox dans un UserControl


Sujet :

VB.NET

  1. #1
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut Ajout d'un ComboBox dans un UserControl
    Bonjour,

    j'essaye de me mettre à VB.Net et j'avoue que venant de VB6, je patauge assez joyeusement. J'avoue ne pas avoir fait beaucoup de recherche su ce forum auparavant car là où je suis en ce moment, j'ai une connexion internet très chaotique qui me permet rarement de rester en ligne plus de 5 ou 10 minutes.
    Voilà ce que j'essaye de faire : un usercontrol contenant entre autre une ComboBox.
    Je voudrais créer une propriété pour ce usercontrol me permettant de remplir la collection Items de cette ComboBox

    Jusqu'ici voilà ce que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Private _MaListe As New List(Of String)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	Public Property MaListe As List(Of String)
            Get
                Return _MaListe
            End Get
            Set(ByVal value As List(Of String))
                _MaListe.AddRange(value)
            End Set
        End Property
    Mais quand je teste mon controle et que je viens sur la prorpriété "MaListe", si j'essaye d'ajouter un item j'ai aussitôt le message :

    Le constructeur sur le type "System.String" est introuvable
    Si quelqu'un peut me venir en aide, merci par avance.
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  2. #2
    Membre émérite
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Points : 2 424
    Points
    2 424
    Par défaut
    ton probleme n'est trop clair.
    j'ai compris le besoin mais le probleme non .



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
     Private _MaListe As New List(Of String)
    	Public Property MaListe As List(Of String)
            Get
                Return _MaListe
            End Get
            Set(ByVal value As List(Of String))
                _Combobox.DataSource=value;
            End Set
        End Property

  3. #3
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Merci déjà de t'y intéresser.
    J'ai donc un UserControl contenant entre autre une combobox (Plusieurs en fait mais si je résouds le problème pour un..). Je voudrais ajouter une propriété appelée "MaListe" à ce user controle qui me permettrait de remplir ce ComboBox.

    Avec ton code, j'ai toujours le même problème. Il manque le constructeur pour le type "System.string"
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour

    Dans la propriété il faut donner un valeur de type List(Of String)

    Voici un exemple plus complet avec la possibilité de d'avoir un id su l'élément choisi


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Private _MaListe As New List(Of Personne)
        Public Property MaListe As List(Of Personne)
            Get
                Return _MaListe
            End Get
            Set(ByVal value As List(Of Personne))
                _MaListe = value
                ComboBox1.DisplayMember = "Nom"
                ComboBox1.ValueMember = "Id"
                ComboBox1.DataSource = _MaListe
            End Set
        End Property
    Avec la classe personne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Class Personne
        Public Property Id As Integer
        Public Property Nom As String
        Sub New()
        End Sub
        Sub New(ByVal I As Integer, ByVal N As String)
            Id = I
            Nom = N
        End Sub
    End Class
    Appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Private l As New List(Of Personne)
        Private Sub ListBoxsToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBoxsToolStripMenuItem.Click
            Dim f As frmListBox = New frmListBox
            AjouteElement(1, "A")
            AjouteElement(2, "B")
            AjouteElement(3, "C")
            f.MaListe = l
            f.Show()
            '        CreInstance(Of frmListBox).Show()
        End Sub
        Public Sub AjouteElement(ByVal Id As Integer, ByVal Nom As String)
            l.Add(New Personne(Id, Nom))
        End Sub
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  5. #5
    Membre éclairé
    Homme Profil pro
    Technicien bio médical
    Inscrit en
    Décembre 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien bio médical
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 328
    Points : 768
    Points
    768
    Par défaut
    Bonjour,

    Dans le code du UserControl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Private _MaListe As List(Of String)
     
    Public Property MaListe() As List(Of String)
        Get
            Return _MaListe
        End Get
        Set(ByVal value As List(Of String))
            _MaListe = value
            Me.cboClient.DataSource = _MaListe
        End Set
    End Property
    Dans le code du formulaire sur l’événement que vous voulez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim lst As New List(Of String)
        With lst
            .Add("Yves")
            .Add("Frédéric")
        End With
        Me.MyUserControl1.MaListe = lst
    Mais comme cela, je ne vois pas l’intérêt d'ajouter des propriétés à votre UserControl alors que l'on peut accéder à tout les contrôles et leurs propriétés.
    Soit cboClient un ComboBox sur le UserControl, dans le code du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim lst As New List(Of String)
        With lst
            .Add("Yves")
            .Add("Frédéric")
        End With
        Me.MyUserControl1.cboClient.DataSource=lst
    est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et

  6. #6
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    @Rainui :
    Je voudrais pouvoir ajouter des éléments à ma combobox quand l'utilisateur de mon usercontrol est en mode design, plutôt que par code. C'est un élément que j'avais omis de mentionner.

    @rv26t :
    Ton code me fait avancer, mais je vais finir par avoir franchement honte, ça coince toujours.
    Pour essai je suis reparti d'un nouveau usercontrol qui ne contient que ce code (celui que tu m'avais proposé) :
    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
    Public Class UserControl1
        Private _MaListe As New List(Of Personne)
        Public Property MaListe As List(Of Personne)
            Get
                Return _MaListe
            End Get
            Set(ByVal value As List(Of Personne))
                _MaListe = value
                ComboBox1.DisplayMember = "Nom"
                ComboBox1.ValueMember = "Id"
                ComboBox1.DataSource = _MaListe
            End Set
        End Property
    End Class
     
    Public Class Personne
        Public Property Id As Integer
        Public Property Nom As String
        Sub New()
        End Sub
        Sub New(ByVal I As Integer, ByVal N As String)
            Id = I
            Nom = N
        End Sub
    End Class
    Si je passe ne mode "test" du usercontrol, ça semble fonctionner, je peux ajouter des éléments. Merci déjà pour ça.

    En revanche si je compile et que je tente d'utiliser le usercontrol, dès que j'essaye de le placer sur la feuille j'ai un message d'erreur à rallonge que je mets en pièce jointe.

    J'avoue ne pas avoir compris ton 3ème bout de code, c'est bien un exemple sur la manière d'utiliser le usercontrol dans une form ou je suis complètement à côté de la plaque ?
    Images attachées Images attachées  
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par OhMonBato Voir le message
    J'avoue ne pas avoir compris ton 3ème bout de code, c'est bien un exemple sur la manière d'utiliser le usercontrol dans une form ou je suis complètement à côté de la plaque ?
    Non c'est sur un form. juste pour l'exemple d'utilisation, mais cela ne devrait pas changer fondemmentalement avec un user contrôle (sauf qu'il n'y as pas besoin de le créer dynamiquement)
    Ce qui donnerai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Private l As New List(Of Personne)
            AjouteElement(1, "A")
            AjouteElement(2, "B")
            AjouteElement(3, "C")
            MonuserControle.MaListe = l
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  8. #8
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Donc si je comprends bien (mais j'ai un gros doute), le code que je mets dans mon message précédent devrait être suffisant pour un usercontrol ?
    Et pourtant ça ne marche pas. Je vais me me pencher sur l'aide pour voir en quoi consiste la sérialisation qui manque visiblement dans ce cas de figure.
    Je vais sans doute perdre ma connexion internet pour quelques heures dans peu de temps. Je reviendrai demain, merci en tout cas pour le temps consacré
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  9. #9
    Membre émérite
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Points : 2 424
    Points
    2 424
    Par défaut
    je n'arrive pas à trouver la difference entre passer une liste des chaines à data source ou bien passer une liste des objets ,normalement toutes deux doivent fonctionné ;

    tu peux nous donner le code où tu tests ton user control?

  10. #10
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par OhMonBato Voir le message
    Donc si je comprends bien (mais j'ai un gros doute), le code que je mets dans mon message précédent devrait être suffisant pour un usercontrol ?
    Effectivement il y a un souci, je n'étais jamais passé à travers un user controle pour ce genre de fonctionnalité.
    Et même avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <Serializable()>
    Public Class Personne
    Il rale. Désolé.

    J'essaye de voir pourquoi.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  11. #11
    Membre émérite
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Points : 2 424
    Points
    2 424
    Par défaut
    a mon avis le probleme n'est pas au niveau de l'alimentation du comobbox mais l'appel d'usercontrol car c'est semblable de la remplir avec des string (List<string> )ou bien des objets(List<Personne>)

  12. #12
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bien, avec un type plus simple, il est possible d'ajouter des éléments à la ComboBox dans le mode Design à travers la propriété _MaListe.
    Avec un user controle comme ceci et une classe ListString
    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
    Public Class uc3
        Private _MaListe As New List(Of ListeString)
        Public Property MaListe As List(Of ListeString)
            Get
                Return _MaListe
            End Get
            Set(ByVal value As List(Of ListeString))
                _MaListe = value
                ComboBox1.DataSource = _MaListe
            End Set
        End Property
    End Class
     
    <Serializable()>
    Public Class ListeString
        Public Property _s As String
        Sub New(ByVal s As String)
            _s = s
        End Sub
        Sub New()
        End Sub
    End Class
    Ce qui donne, voir miniature attachée.

    C'est une petite progression.
    Mais, il reste 2 problèmes :
    VB ne veut pas enregistrer le contrôle dans son fichier .resx de la form sur laquelle il est posé, et provoque une errreur de compil.
    La liste ne se conserve pas.

    N'ayant jamais procédé ainsi pour des user contrôles, je ne sais pas si c'est une bonne piste. Il faut peut être rechercher sur internet sur la façon de procéder, ou attendre de voir les idées d'autres membres plus habitués avec ce concept.
    Images attachées Images attachées  
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  13. #13
    Membre émérite
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Points : 2 424
    Points
    2 424
    Par défaut
    je ne comprend pas mais j'ai réalisé ça en 2 min sans avoir des problemes

    même si en C# mais c'est la même principe

    usercontrol

    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
     
     
     public partial class UserControl1 : UserControl
        {
            public UserControl1()
            {
                InitializeComponent();
            }
            private List<personne> _maliste = new List<personne>();
     
            public List<personne> Maliste
            {
                get { return _maliste; }
                set { comboBox1.DataSource = value;
                comboBox1.DisplayMember = "name";
                }
            }
     
        }
        public class personne
        {
            public personne(string _id, string _name)
            {
                id = _id; name = _name;
            }
            public string id { get; set; }
            public string name { get; set; }
        }
    form1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      private void Form1_Load(object sender, EventArgs e)
            {
                List<personne> lis = new List<personne>();
                lis.Add(new personne("1","az1"));
                lis.Add(new personne("2","az2"));
                lis.Add(new personne("3", "az3"));
                lis.Add(new personne("4","az4"));
                userControl11.Maliste = lis;
            }
    et si ta un probleme dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     // this.userControl11.Maliste = ((System.Collections.Generic.List<personne>)(resources.GetObject("userControl11.Maliste")));
    tu peux le mettre en commentaire

    c# to Vb.NET

  14. #14
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Et userControl11.Maliste vous l'alimentez comment en mode Design ?

    Parceque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Class uc2
        Private _MaListe As New List(Of String)
        Public Property MaListe As List(Of String)
            Get
                Return _MaListe
            End Get
            Set(ByVal value As List(Of String))
                _MaListe = value
                ComboBox1.DataSource = _MaListe
            End Set
        End Property
     
    End Class
    avec l'appel classique par code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                Dim MaLst As New List(Of String)
                MaLst.Add("d")
                MaLst.Add("e")
                MaLst.Add("f")
                MaLst.Add("g")
                Uc21.MaListe = MaLst
    fonctionne très bien, on est d'accord. (voir miniature 1 cuListe)
    Mais comment faites vous pour alimenter la propriété _MaListe en mode design car là, survient le problème de OhMonBato. voir message d'erreur miniature 2 err_string

    D'ou ma proposition post13 qui donne comme possibilité : voir miniature 3 UserCtrl
    Images attachées Images attachées    
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  15. #15
    Membre émérite
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Points : 2 424
    Points
    2 424
    Par défaut
    aussi ça marche avec le code de la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     [Serializable]
        public class personne 
        {
            public personne() { }
            public personne(string _id, string _name)
            {
                id = _id; name = _name;
            }
            public string id { get; set; }
            public string name { get; set; }
        }
    je suis sur Visual studio 2008

    et voila un écran
    Images attachées Images attachées  

  16. #16
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    On doit vraiment louper quelque chose , je regarderai plus tard.
    Merci azstar.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  17. #17
    Membre émérite
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Points : 2 424
    Points
    2 424
    Par défaut
    Avec grand plaisir

  18. #18
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bon reprenons proprement (nouvelle classe, nouveau User Control)

    La classe personne définie proprement
    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
    <Serializable()>
        Public Class Personne
        Private _Id As Integer
        Public Property Id() As Integer
            Get
                Return _Id
            End Get
            Set(ByVal value As Integer)
                _Id = value
            End Set
        End Property
        Private _Nom As String
        Public Property Nom() As String
            Get
                Return _Nom
            End Get
            Set(ByVal value As String)
                _Nom = value
            End Set
        End Property
        Sub New()
        End Sub
        Sub New(ByVal I As Integer, ByVal N As String)
            Id = I
            Nom = N
        End Sub
    End Class
    (j'était parti d'un cour qui indiquait -Enfin on peut utiliser un tableau de Structure (ou d'objets définis par une Classe) et l'exemple montrait la définition directe avec property mais pour une structure, j'ai eu tord de croire que cela était aussi applicable pour une classe). Le principal est de comprendre ce qui est incorrect.
    Désolé OhMonBato.

    La classe User Control
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Class ucComboBox
        Private _MaListe As List(Of Personne)
        Public Property MaListe As List(Of Personne)
            Get
                Return _MaListe
            End Get
            Set(ByVal value As List(Of Personne))
                _MaListe = value
                ComboBox1.DisplayMember = "Nom"
                ComboBox1.ValueMember = "Id"
                ComboBox1.DataSource = _MaListe
            End Set
        End Property
    End Class
    On génére. Ok.

    La dépose du composant user contrôle sur la form se passe bien

    1ère étape, test classique

    Utilisation classique par code dans la form
    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
        Private ListePersonnes As List(Of Personne) = New List(Of Personne)
        Private Sub frmListBox_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Try
                RempliListePersonnes()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Public Sub RempliListePersonnes()
            AjoutePersonne(0, "Herve")        ' alimente la liste
            AjoutePersonne(1, "Jean")
            UcComboBox1.MaListe = ListePersonnes        ' affecte la liste au User Controle
        End Sub
        Public Sub AjoutePersonne(ByVal Id As Integer, ByVal Nom As String)
            ListePersonnes.Add(New Personne(Id, Nom))
        End Sub
    Tout fonctionne bien

    on enlève le code de la form
    ______________________________________

    2ème étape, saisie des éléments personnes dans le design de la form.

    La saise fonctionne bien, (nous arrivons sur la même image qu'azstar : propriété remplie dans la fenêtre de saisie; voir miniature 1 - SaisePersonnes) seulement rien n'est sauvegardé lorsque je valide par OK.
    Si je reprend la collection de MaListe en saisie, elle est vide. ??? (voir miniature 2 -SaisePersonnesReprise) (donc rien dans la combo a l'exécution, normal)

    @azstar : Avez-vous été jusqu'au bout du test pour voir le résultat à l'exécution ?
    D'ou provient this.userControl11.Maliste = ((System.Collections.Generic.List<personne>)(resources.GetObject("userControl11.Maliste")));
    Images attachées Images attachées   
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  19. #19
    Membre émérite
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Points : 2 424
    Points
    2 424
    Par défaut
    Pour moi tout passe bien:
    -Sauvegarde design
    -compilation
    -Exécution

    Et pour la ligne c est desrialiser ce que stocke dans les ressources

  20. #20
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour OhMonBato
    Le constructeur sur le type "System.String" est introuvable
    Normal pour combo,listbox... appeles "controls de liste"...
    Quand ils sont lies à des class Perso comme souligne par Azastar tu n'as pas precise les props DisplayMembre et ValueMember.
    Dans ce cas ces ils affichent le desesperant "Class.ToString()" c.à.d le nom du class helas...
    Pour un "control complexe" comme dgv il faut preciser la prop DataMember(nom du class) sinon on obtient encore le desesperant ""Class.toString()"

    Concernant ta custom Prop List si tu veux avoir le controle complet en Mode Design et au run-time il faut un "chouia plus"
    1/ Il faut qu'elle soit serializable en mode design par le designer VS...
    -dote de l'attribut <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> (believe me comme le disait un gars de microsoft)...
    Cela permet de garder les props ajoutes en mode designe au run-time (execution)...
    -c'est pour cela qu'il gueule ...!!!!
    De plus j'ai mis dans (code qui suit):
    -attribut <browsable(true)> permet de voir la prop dans Inspecteur des props
    -attribut <categorie("ZZZ")> la prop s'affiche dans categorie ZZZ ,z pour la placer en dernier par commodite.....
    l

    2/Cela n'est pas suffisant
    - ta liste doit heriter de BindingList(of Personne) et non du simple list(of).
    Cela permet ton "plus":
    - ajouter des items Personne sur designer ou les supprimer
    - binder ton combo à la list(of ) de ton user control.
    - voir le combo se rafraichir au design...

    Sainte Mere c'est un peu plus compilque mais pas difficile :
    voici le 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    'NOTA BENE 1:
    ' ComboBox1 est droppe par tes soins depuis la boite à outils
    ' sur la surface du user control
     
    'NOTA BENE 1:
    'à chaque modif du usercontrol ,n'oublie pas de regenerer ton projet...
     
    Imports System.ComponentModel
     
    Public Class UserControl1
     
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            Me.AutoSize = True
            Me.BorderStyle = BorderStyle.FixedSingle
     
            '---------------- handler ListChanged
            AddHandler Persons.ListChanged, AddressOf HandlerListChanged
     
        End Sub
        '----------------c'est ce sanhandler de BindingList  qui mettra à jour
        '----------------en mode design &  run-time----------
        '----------------le Combox1 droppe par tes soins de la boite à outils
        Private Sub HandlerListChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ListChangedEventArgs)
            ComboBox1.DataSource = Persons        '-----la liste 
            ComboBox1.DisplayMember = "Nom"       '----- nom prop affiche
            ComboBox1.ValueMember = "ID"          '----- nom prop de gestion
        End Sub
     
     
        '----------------Prop Persons avec attribut DesignerSerializationVisibility
        '----------------pour pouvoir ajouter des elements 
        '----------------en mode design
        '----------------et les retrouver .....au run-time!!!!
        Private m_Persons As New ListPersons
        <Browsable(True)>
         <Category("ZZZ")>
         <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
        Public Property Persons() As ListPersons
            Get
                Return m_Persons
            End Get
            Set(ByVal value As ListPersons)
                m_Persons = value
            End Set
        End Property
     
     
    End Class
     
    '----------------Class personne 
    Public Class Personne
        '----------------ctor sans parametre obligatoire pour le designer
        Public Sub New()
        End Sub
        Public Sub New(ByVal pid As String, ByVal pnom As String)
            ID = pid
            Nom = pnom
        End Sub
        Public Property ID() As String
        Public Property Nom() As String
     
     
     
    End Class
    '----------------le list = > doit heriter de BindingList
    '----------------avec notifier active ( Me.RaiseListChangedEvents
    Public Class ListPersons
        Inherits BindingList(Of Personne)
        Public Sub New()
            Me.AllowNew = True         ' ajout d'un objet Personne
            Me.AllowEdit = True        ' edition-modification  
            Me.AllowRemove = True      'suppression
            Me.RaiseListChangedEvents = True   'notifie mr binding
     
        End Sub
     
     
    End Class
    Une astuce en plus...Comme ton usercontrol possede une prop de type BindingList tu peux aussi rajouter :
    menu source de donnes -> ajouter -> objet -> coche ton usercontrol.-> terminer
    Apres droppe sur le form un "intrus" listbox par exemple ,et regarde dans sa prop data source en cliquant dans selecteur tu verras la Prop Persons du usercontrol que tu dois selectionner...
    Et voila l' "intrus" listbox du form qui lui aussi sera binde à la liste Persons...!!!


    bon code....

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. ajout dynamique de combobox dans une cellule
    Par kelvir dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/09/2011, 14h45
  2. Ajouter combobox dans datagridview + dataset
    Par Gdal dans le forum VB.NET
    Réponses: 1
    Dernier message: 29/05/2007, 23h09
  3. Ajouter un ComboBox dans un TDBGRind
    Par djabara dans le forum Bases de données
    Réponses: 1
    Dernier message: 15/11/2006, 16h11
  4. [VB.NET] ajouter combobox dans un datagrid
    Par HULK dans le forum Windows Forms
    Réponses: 6
    Dernier message: 27/10/2005, 14h30

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