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 :

List et lien entre 2 objets pour du databinding entre 2 datagridview


Sujet :

C#

  1. #1
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 916
    Points : 1 930
    Points
    1 930
    Par défaut List et lien entre 2 objets pour du databinding entre 2 datagridview
    Bonjour

    Je souhaite pouvoir ajouter et modifier des objets "Cycle" dans datagridView1 et ajouter et modifier une liste d'objets "Param" dans datagridView2, liste correspondant au "Cycle" sélectionné dans datagridView1.

    J'ai cru intéressant de créer une classe "Phase" associant un objet "Cycle" à un List<Param>.
    Avec List<Phase> j'obtiens ainsi une liste d'association entre un "Cycle" et un List<Param>

    Je n'arrive pas à donner à DatagridView1.DataSource la liste des "Cycles" de la list<Phase>
    Evidement je n'arrive pas plus à donner à DatagridView1.DataSource la liste<Param> de la phase sélectionnée dans DatagridView1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    List<Phase> myPhases = new List<Phase>();
    BindingSource CycleSource = new BindingSource();
    BindingSource ParamSource = new BindingSource();
     
    CycleSource = myPhases ; // ne marche pas , "pas compatible avec le type Bindingsource" ??????????????
    ParamSource = myPhase[Ligne selectionnée].Parametres ; //ligne imaginaire pour le moment 
     
    dataGridView1.DataSource = CycleSource;
    dataGridView2.DataSource = ParamSource;
    1) Est ce une bonne manière de structurer les données que mon List<Phase> ?
    2) si oui, comment associer à datagridView1.Datasource les "Cycle" contenus dans List<Phase> ?
    3) Si non, quelle serait une bonne méthode pour associer


    Voici les 3 classes Cycle, Param et phase que j'utilise pour tester :
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    class Phase
    {
        public Phase()
        {
            _Cycle = new Cycle();
            _Parametres = new List<Param>();
        }
     
        private Cycle _Cycle;
        public Cycle Cycle
        {
            get { return _Cycle; }
            set { _Cycle = value; }
        }
     
        private List<Param> _Parametres;
        public List<Param> Parametres
        {
            get { return _Parametres; }
            set { _Parametres = value; }
        }
    }
     
     
     
    class Cycle
    {
        public Cycle()
        {
            _AdresseDebut = 0;
            _Nbdepoint = 0;
        }
     
     
        private UInt16 _AdresseDebut;
        public UInt16 AdresseDebut
        {
            get { return _AdresseDebut; }
            set { _AdresseDebut = value; }
        }
     
        private Byte _Nbdepoint;
        public Byte Nbdepoint
        {
            get { return _Nbdepoint; }
            set { _Nbdepoint = value; }
        }
    }
     
    class Param
    {
        public Param()
        {
            _NomParam = "Nom paramètre";
            _TypeVar = 1;
            _Endianess = 0;
            _Modele1 = true;
            _Modele2 = false;
        }
     
        private String _NomParam;
        public String NomParam
        {
            get { return _NomParam; }
            set { _NomParam = value; }
        }
     
        private Byte _TypeVar;
        public Byte TypeVar
        {
            get { return _TypeVar; }
            set { _TypeVar = value; }
        }
     
        private Byte _Endianess;
        public Byte Endianess
        {
            get { return _Endianess; }
            set { _Endianess = value; }
        }
     
        private Boolean _Modele1;
        public Boolean Modele1
        {
            get { return _Modele1; }
            set { _Modele1 = value; }
        }
     
        private Boolean _Modele2;
        public Boolean Modele2
        {
            get { return _Modele2; }
            set { _Modele2 = value; }
        }
    }
    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Pour le binding, voici un exemple avec tes données

    J'ai fait ça en 2 minutes... donc, c'est juste la base !!!

    mais ça devrait t'aider à comprendre l'utilisation des bindingSource, des datasources, etc...
    Fichiers attachés Fichiers attachés
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 916
    Points : 1 930
    Points
    1 930
    Par défaut
    Merci pour le temps

    mais je passer pour un manchot ; je n'arrive pas à ouvrir correctement ce projet ! il ne trouve pas un type petitOurs.cycle...

    J'ai double cliqué sur le PetitOurs.csproj; sur mes projets j'ai un .sln


    Je suis impatient de voir comment ça se goupille, là je me suis embarqué avec un dataset qui contient 2 tables ; ça fonctionne bien mais il y a peut être beaucoup plus simple ! :-P
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Visual studio 2012

    tu es avec quel version de VS ?
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    ajoute public devant chaque classe du fichier tester.cs

    Ca devrait le faire en faisant ça
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  6. #6
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 916
    Points : 1 930
    Points
    1 930
    Par défaut
    Bonjour

    Je suis sous VS 2015 community, mais çà y est ça tourne

    De ce que je vois/comprends, en passant par un bindingsource le datagridview affiche les 2 champs qui correspondent au "cycle" contenu dans un élément de List<Phase>.
    Ça j'ai bien pigé maintenant

    Mais du coup comment peut on afficher (dans une autre datagridview ou autrepart) les éléments du List<Param> qui sont également contenus dans l’élément du List<Phase>, au même niveau que le "cycle" ?


    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  7. #7
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    pour afficher dans une autre grille les éléments de ta phase qui se trouve dans une liste d'un objet cycle, il faut gérer l'élément sélectionné
    dans la datagrid1 et faire un binding avec l'élément phase comme j'ai fait avec l'élément cycle...

    et à chaque changement de sélection, il faut mettre à jour ce binding...

    Si tu fais une recherche sur google, en mettant genre "how to bind two datagridview in C#" , tu trouveras plein d'explications plus complètes que la mienne !
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  8. #8
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 916
    Points : 1 930
    Points
    1 930
    Par défaut
    J'ai réussi à le faire avec un Dataset , 2 tables et un identifiant IDcycle que je reprends sur le row correspondantes de la table "Parametres"
    Le principe du databinding j'ai du comprendre du coup.
    Par contre, ici, avec la list<Phases> qui associée dans chaque item un objet "Cycle" et un objet "List<Param>, je ne vois pas comment désigner le List<Param> sélectionner pour le passer dans le datasource du second datagridView

    Avec la solution Dataset j'ai fait ceci sur un cellClick de du premier datagridview
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Tables["TableParametres"].DefaultView.RowFilter = string.Format("{0} = {1}", "IDcycle", dataGridView1.SelectedRows[0].Cells["IDcycle"].Value.ToString());
    Est ce possible de faire l'équivalent avec la solution List ? et si oui, ai-je un intérêt à le faire (utiliser cette List<Phases>) plutôt qu'utiliser un Dataset ?

    Merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  9. #9
    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

    C'est du "maitre/detail" analogue à celui de la Relation de 2 tables en BD sauf que dans e cas des tables en BD il est inscrit "en dur" dans la table Enfant avec une clé secondaire etrangère(clé de la table Principale)...
    Ici vu que tu fais de la POO les cles sont des pointeurs ou references...

    Aussi le class Phase est totalement superfétatire !!!
    En fait un List<Cycle> pourvoit amplement au but recherche ...
    Ensuite pour afficher List<Cycle> il suffit d'un BindingSource1 et du DGV1
    Bindingsource declenche l'event PositionChanged ou l'item(cycle) peut etre "trappe" ce qui permet de recuperer son List<Pram> (enfants ) ...
    Cette List<Param> est assignée à 2e Bindinsource lequel est assigne à DGV....

    Les operations habituelles d'ajout ,d'edition et de suppression se font à l'accoutume via les DGV ...
    code behind .cs des class Data:
    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
     
     
     public  class ParentCycle
        {
            public ParentCycle()
            {
                ChildParams = new List<ParamChild> ();
            }
            public string Name { get; set; }
            public List<ParamChild> ChildParams { get; set; }
        }
        public class ParamChild
        {
            public string ID { get; set; }
            public string Name { get; set; }
        }
       public class ListParentCycles : List<ParentCycle>
        {
            private  ParentCycle item = null;
            private ParamChild subitem = null;
            public ListParentCycles()
            {
                for (int i = 1; i < 21; i++)
                {
                    item=new ParentCycle(){ Name="CycleItem"+i.ToString()};
                    for (int j = 1; j < 11; j++)
                    {
                        subitem=new ParamChild(){ID =i.ToString ()+j.ToString(), Name="ParamItem"+j.ToString()};
                        item.ChildParams.Add(subitem);
                    }
                    this.Add(item);
                }
            }
     
     
        }
    code behind .cs du form user:

    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
     
     
     public  class ParentCycle
        {
            public ParentCycle()
            {
                ChildParams = new List<ParamChild> ();
            }
            public string Name { get; set; }
            public List<ParamChild> ChildParams { get; set; }
        }
        public class ParamChild
        {
            public string ID { get; set; }
            public string Name { get; set; }
        }
       public class ListParentCycles : List<ParentCycle>
        {
            private  ParentCycle item = null;
            private ParamChild subitem = null;
            public ListParentCycles()
            {
                for (int i = 1; i < 21; i++)
                {
                    item=new ParentCycle(){ Name="item"+i.ToString()};
                    for (int j = 1; j < 11; j++)
                    {
                        subitem=new ParamChild(){ID =i.ToString ()+j.ToString(), Name="subItem"+j.ToString()};
                        item.ChildParams.Add(subitem);
                    }
                    this.Add(item);
                }
            }
     
     
        }
     
     
      private void bdsItems_PositionChanged(object sender, EventArgs e)
            {
                BindingSource bds = sender as BindingSource;
                ParentCycle item = bds.Current as ParentCycle;
                bdsChildParams.DataSource = item.ChildParams;
                dataGridView2.DataSource = bdsChildParams;
            }
    Note Bene : rien n'empeche d'étendre ce processus diabolique "maitre/detail" à trois listes en casdade par exemple un prop List<Transition> dans le class Param d'un hypothetique class Transition ....et 3 bds et 3 dgv relies par PositionChanged...........
    bon code....

Discussions similaires

  1. Pattern pour des contraintes entre Objet
    Par fabgamer dans le forum Design Patterns
    Réponses: 7
    Dernier message: 24/09/2010, 13h06
  2. [XL-2003] lien hypertext : chemin absolu pour une copie de celulle entre deux fichier
    Par leprechaun dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 07/07/2009, 15h20
  3. [eZ Publish] Liste de liens des objets articles
    Par yamatoshi dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 31/07/2008, 19h01
  4. Lien entre 2 objets et insert
    Par speechmill dans le forum Hibernate
    Réponses: 11
    Dernier message: 19/12/2007, 10h47
  5. lien entres deux objets
    Par surfing903 dans le forum Langage
    Réponses: 17
    Dernier message: 15/08/2007, 19h55

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