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

C# Discussion :

comboBox objets metiers datagridview


Sujet :

C#

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut comboBox objets metiers datagridview
    dsl de remettre ce message j'en ai vu des dizaines déjà sur le forum mais aucun ne m'a donné la solution .

    Voi j'ai une archi 3/3 je fais une requetes et je recois des objets métiers contenant des Civilités (Id/Lib/lib réduit)
    Je veux remplacer le txtbox du DGV par un CBbox dc j'ai regardé comment l'on fait cela dans la msdn :
    je supprime la colonne
    j'en créé une nouvelle, je lui affecte une valueMember 'xx' et une display member 'yy' mais le problème c'est que j'ai toujours une erreur m'informant que le champ demandé n'existe pas...

    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
     
    ----------------------------------------
    OBJET TRANSPORT LOCATAIRE 
     
    public Civilite()
            {
     
                Id= String.Empty;
                Lib = String.Empty;
            }
     
    public Locataire()
            {
     
                Nom = String.Empty;
                Prenom = String.Empty;
                Civilite = new Civilite;
     
            }
     
    ------------------------------
     
     
    //ici le code ds la couche de présentation 
     
     
    int position = dGViewLocataire.Columns["Civilite"].Index;
                    dGViewLocataire.Columns.Remove("Civilite");
                    DataGridViewComboBoxColumn comboboxColumn = new DataGridViewComboBoxColumn();
                    comboboxColumn.Name = "Civilite";
                    comboboxColumn.HeaderText = "Titre représentant";
                    comboboxColumn.Width = 90;
                    comboboxColumn.MaxDropDownItems = 6;
                    comboboxColumn.ValueMember = "Civilite";
                    //comboboxColumn.DisplayMember = "";
                    comboboxColumn.DataPropertyName = "Civilite";
                    comboboxColumn.DataSource = Titres;
                    dGViewLocataire.Columns.Insert(position, comboboxColumn);
    Titres une liste générique de civilité.
    Ma source de données n'est pas un DataSet mais une liste d'objet métiers

    Désolé c'est un problème récurent sur le forum mais je n'ai pas réussi a trouver la solution

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    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
    public Civilite()
            {
     
                Id= String.Empty;
                Lib = String.Empty;
            }
     
    public Locataire()
            {
     
                Nom = String.Empty;
                Prenom = String.Empty;
                Civilite = new Civilite;
     
            }
    C'est koi ce code ? Des classes des méthodes ?
    Dans les deux cas le code est faux.
    Tout ce que cela peut être c'est des constructeurs des classes Civilite et Locataire. Si c'est le cas précise le ou poste un code du genre :
    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 Civilite
    {
    public Civilite()
            {
                
                Id= String.Empty;
                Lib = String.Empty;
            }
    } 
    
    public class Locataire
    {
    public Locataire()
            {
                
                Nom = String.Empty;
                Prenom = String.Empty;
                Civilite = new Civilite();
     
            }
    }
    Parce que c'est un peu désorientant sinon. De plus je t'ai corrigé une faute, l'instanciation d'un objet ce fait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Toto t;
    t = new Toto();
    Le () veut dire que tu utilises le constructeur vide de la classe Toto, si tu veux utiliser un constructeur qui possède des paramètres :
    Mon paramètre étant une string.

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    oui dsl Ce sont bien des classes transport.

    j'ai mangé les parenthèses dans mon copier coller pour le constructeur du locataire car j'ai changé les noms pour simplifier les choses dans le post ( a tort lol)
    Donc ma question est juste de savoir comment mettre des objets complexes dans la datagridComboBoxColumn qui soit binder avec l'objet de chacune des lignes de la datasource du datagridView.
    ==> en francais ds le texte

    J'ai plusieurs locataires (liste d'objets transport de type Locataire), je les mets tous dans un datagrid. Chaque locataire a une propriété Civilite.
    J'ai une liste d'objets transports Civililites qui contient des objets Civilite. Je souhaite avoir une liste détoulante des civilités possibles pour tous les locataires dans une colonne particulière avec une préselection si le locataire en a déjà une.


    Pour mettre en place ca :
    Je récupère ma liste d'objets locataire depuis la couche métier.
    Je lie cette liste au datagridView
    Je n'affiche que les colonnes qui m'interesse en applicant la propriété Visible au cas par cas.
    Je supprime la colonne de Civilité

    je créé un objet DataGridViewComboBoxColumn
    Je mets renseigne sa source de données et son binding sur le dataGRid
    je le lie au Datagrid

    Ca marche pas

    ce qui donne au final

    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
    /Datagrid des locataires
                dGViewLocataire.DataSource = DMI.CptClient.Locataires;
    
                ///On va regarder chacune des colonnes pour savoir si on l'affiche ou non 
                foreach (DataGridViewColumn dgvc in dGViewLocataire.Columns)
                {
    
                    if (
                        dgvc.Name.Equals("Nom")
                        || dgvc.Name.Equals("CiviReprePar")
                        || dgvc.Name.Equals("RepresentePar")
                        || dgvc.Name.Equals("chPresent")
                        )
                    {
                        dgvc.Visible = true;
                    }
                    else
                    {
                        dgvc.Visible = false;
                    }
    
                }
    
                ///On remplace le champs texte par un menu déroulant pour avoir la liste des titres de civilité
                ///
                try
                {
                    int position = dGViewLocataire.Columns["CiviReprePar"].Index;
                    dGViewLocataire.Columns.Remove("CiviReprePar");
                    DataGridViewComboBoxColumn comboboxColumn = new DataGridViewComboBoxColumn();
                    comboboxColumn.Name = "CiviReprePar";
                    comboboxColumn.HeaderText = "Titre représentant";
                    comboboxColumn.Width = 90;
                    comboboxColumn.MaxDropDownItems = 6;
                    comboboxColumn.ValueMember = "";
                    comboboxColumn.DisplayMember = "";
                    comboboxColumn.DataPropertyName = "CiviReprePar";
                    comboboxColumn.DataSource = Titres;
                    dGViewLocataire.Columns.Insert(position, comboboxColumn);
    
                }
                catch (Exception ex) 
                {
                    MessageBox.Show("Erreur création du datagrid"+ ex.Message, "Erreur", MessageBoxButtons.OK);
                }
    J'espère avoir été plus clair dans mes explications

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    dsl je fais remonter...

  5. #5
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Ca marche pas
    Cela veut dire ?
    Une erreur ? Cela affiche autre chose que ce que tu attends ?

  6. #6
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    les proprietes de ma datagridComboBoxColumn ValueMember et DisplayMember génèrent toujours des erreurs

    voici le message l'erreur catcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Le champ appelé xxxx  n'existe pas.
    ou xxx est la valeur affectée à ValueMember


    je comprend bien que la valeur que je met ne correspond pas mais il me semble bien avoir pourtant compris ce qu'attend cette propriété

    ValueMember <== attend le champ correspondant à la propriété de l'utilisateur ici Civilite
    DisplayMember <== attend la propriete a afficher de la Civilite ici Libelle

    Je me demande l'erreur ne proviendrait pas de la colonne qui n'arriverait pas a se binder aux objets utilisateurs

    Merci de vos réponses

  7. #7
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    les proprietes de ma datagridComboBoxColumn ValueMember et DisplayMember génèrent toujours des erreurs

    voici le message l'erreur catcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Le champ appelé xxxx  n'existe pas.
    ou xxx est la valeur affectée à ValueMember


    je comprend bien que la valeur que je met ne correspond pas mais il me semble bien avoir pourtant compris ce qu'attend cette propriété

    ValueMember <== attend le champ correspondant à la propriété de l'utilisateur ici Civilite
    DisplayMember <== attend la propriete a afficher de la Civilite ici Libelle

    Je me demande l'erreur ne proviendrait pas de la colonne qui n'arriverait pas a se binder aux objets utilisateurs

    Merci de vos réponses

  8. #8
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    ValueMember <== attend le champ correspondant à la propriété de l'utilisateur ici Civilite
    Ce champ ne correspond pas à une chaine de caractere vide, non ?
    Parce que là c'est ce que tu passe à ValueMember.

  9. #9
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    non non la j'ai mis ca ds mon code car je ne sais pas quoi mettre, j'ai deja fais des essais avec plusieurs valeurs dont :


    valueMember = "CiviReprePar"

    ou
    valueMember = "Titre"

    ou
    valueMember = ""


    Sachant que "CiviReprePar" est le nom de la propriété dans un objet Utilisateur.
    Sachant que "Titre" est le type de la propriété dans un objet Utilisateur.

    je rappelle qu'une liste d'Utilisateur est passé en datasource du DGV

    J'ai aussi essayé d'affecter ds un ordre différent mais rien ne fait

    Merci de ta réponse et des suivantes si possibles

  10. #10
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Dans tous les cas tu as essayé avec une chaine de caractères

  11. #11
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    ben comme tu dis ca marche très bien

    c'est avec des objets complexes qu'il essaye de me rendre fou

  12. #12
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    J'ai refais un bout de code a coté


    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
     public Form1()
            {
                InitializeComponent();
    
    
                ///On créé des titres
                titres = new List<Titre>();
                for(int i = 0 ; i< 10; i++)
                {
                    titres.Add(new Titre("Titre " + i));
                }
    
                /// on créé des utilisateurs
                /// 
                users = new List<User>();
                for (int i = 0; i < 10; i++)
                {
                    User user = new User();
                    user.Id = "user " + i;
                    user.Titre = titres[i];
                    users.Add(user);
                }
    
                ///on ajoute la liste des utilisateurs au datagrid
                /// 
                dgv.AutoGenerateColumns = false; 
                dgv.DataSource = users;
    
                ajouterColonne();  
    
            }
    
            private void ajouterColonne()
            {
    
                DataGridViewTextBoxColumn dgvtBxC = new DataGridViewTextBoxColumn();
                dgvtBxC.Name= "Id";
                dgvtBxC.DataPropertyName = "Id";
    
                dgv.Columns.Add(dgvtBxC);
    
                DataGridViewComboBoxColumn dgvcbc = new DataGridViewComboBoxColumn();
    
                dgvcbc.DataSource = titres;
                //dgvcbc.ValueMember = "Titre";
                dgvcbc.DataPropertyName = "Titre";
                dgvcbc.DisplayMember = "Id";
                dgvcbc.Name = "Titre2";
        
                dgv.Columns.Add(dgvcbc);
    
            }
    tous fonctionne bien masi je n'arrive pas a lier l'objet titre a liste dans la colonne ca bug tt le tps




    je met un une valeur ds le DataPropertyName
    et j'ai une erreur de format ds le datagridviewcomboBoxCell
    si je les laisse vide j'ai bien ma liste mais elle n'est pas binder avec le reste

    NB : La propriété des ID elle se place bien ds le DGV, je pense que le pb viens dc du DataPropertyName et/ou ValueMember

    Il semblerait logique que DataPropertyName soit = "Titre" car c'est le nom de la propriété dans l'objet Utilisateur et que cela fonctionne pour la propriété "Id"

    Dans la meme logique je pense que ValueMember = "Titre" car la propriété est de ce type

    la prorpiété a le meme nom que son Type.... Titre Titre = new Titre();

    J'espère que vous me sauverez avant que j'arrive au point de non retour et que je change de métier... merci

  13. #13
    Membre éclairé Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Par défaut
    Essaye deja de remplir un ComboBox normal (sans DataGridView) avec toutes tes donnees.

    Ensuite, les ToolStripComboBox sont assez speciaux, j'ai mis pas mal de temps a essayer de le lier avec une source de donnees. La seule solutino qui marche nickel est de creer un ComBox normal est de copier le BindingContext de ce ComboBox sur ton ToolStripComboBox.

    Ca donne ca dans mon appli :
    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
                // Creer un ComboBox invisible contenant les donnees
                ComboBox MyConditionComboBox = new ComboBox();
                MyConditionComboBox.Visible = false;
                Controls.Add(MyConditionComboBox);
                MyConditionComboBox.Name = "MyConditionComboBox";
                MyConditionComboBox.FormattingEnabled = true;
                MyConditionComboBox.DropDownStyle = ComboBoxStyle.DropDownList;
                MyConditionComboBox.DisplayMember = "CONDITION_NAME";
                MyConditionComboBox.ValueMember = "CONDITION_ID";
                MyConditionComboBox.DataSource = dS_Condition.T_CONDITION;
     
                // Copier le contexte de Binding et lier le Combo du menu a la source de donnees comme l'autre ComboBox
                this.cbx_MenuConditions.ComboBox.BindingContext = MyConditionComboBox.BindingContext;
                this.cbx_MenuConditions.ComboBox.DisplayMember = "CONDITION_NAME";
                this.cbx_MenuConditions.ComboBox.ValueMember = "CONDITION_ID";
                this.cbx_MenuConditions.ComboBox.DataSource = dS_Condition.T_CONDITION;

  14. #14
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    Je comprend l'idée mais c'est bizarre créer une cbx a coté et la cacher en disant qu'il faut faire un lien entre en binding de la cbx et celui d'un autre controle... Ils ont bien du penser a ca chez MS. Enfin j'espère, le truc c'est que je prefere avoir direct la meilleure solution plutot que d'aller modifier ts mon projet x fois...

    c ki : cbx_MenuConditions ???? c un datadridView ?

    C'est pareil toi ca fonctionne avec des String uniquement..moi aussi ca marche si je n'utilise que des string... Le pb bien qu'en je jongle avec des objets complexes imbriqués.

    Merci de ta réponse ca fait tjrs avancé le "shmilblik"

    A la rigueur je suis prêt a me faire insulter par des pros qui pourraient résoudre ca en 2x2

  15. #15
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    A la rigueur je suis prêt a me faire insulter par des pros qui pourraient résoudre ca en 2x2
    C'est pas moi. Je peut insulter mais je ne peut pas résoudre cela en deux secondes.

    Désolé mais je ne peut pas t'aider, je n'ai pas fait ce genre de chose, tout ce que je peut te conseiller c'est et msdn.

    Bon j'ai trouvé cela sur le net :
    http://msdn2.microsoft.com/fr-fr/lib...or(VS.80).aspx

    http://www.codeproject.com/cs/miscct...oboxcolumn.asp

    http://download.microsoft.com/downlo...%20winform.doc

    Aucune idée si cela va t'aider, cela me semblait parler de ton sujet, maintenant je n'en suis pas sur.

  16. #16
    Membre éclairé Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Par défaut
    cbx_MenuConditions est mon ToolStripComboBox

  17. #17
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut s'il y a un problème, il y a une solution,
    s'il n'y a pas de solution il n'y a pas de problème... le dalai lama

    il a bien raison cet homme

    Enfin j'ai trouvé une solution sur le forum de MS... donc le but est simplement de mettre dans ton business object la propriété 'Self' ou le nom que tu souhaites d'ailleurs et de lier cette propriétés au binding

    Ca dans la classe Titre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       public Titre Self
            {
                get { return this; }
            }
    Ca dans la création du datagridviewcombobowcolumn

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                DataGridViewComboBoxColumn dgvcbc = new DataGridViewComboBoxColumn();
                titres.Insert(0, new Titre());
                dgvcbc.DataSource = titres; 
                dgvcbc.DefaultCellStyle.NullValue = new Titre();
                dgvcbc.Name = "Titre";
                dgvcbc.DataPropertyName = "Titre";
                dgvcbc.DisplayMember = "Id";
                dgvcbc.ValueMember= "Self";   
     
                dgv.Columns.Add(dgvcbc);

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

Discussions similaires

  1. Objets Metiers dans GWT
    Par tatemilio2 dans le forum GWT et Vaadin
    Réponses: 3
    Dernier message: 22/04/2008, 21h23
  2. Combobox integrée dans DataGridView
    Par waterman dans le forum Windows Forms
    Réponses: 8
    Dernier message: 13/11/2007, 11h47
  3. Combobox dans un datagridview
    Par nuriel2 dans le forum C#
    Réponses: 3
    Dernier message: 31/10/2007, 14h18
  4. objet metier briques logicielles
    Par ldoudon dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2007, 11h15
  5. Réponses: 3
    Dernier message: 06/07/2007, 09h17

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