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

Framework .NET Discussion :

Datagridview et sous-classes


Sujet :

Framework .NET

  1. #1
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut Datagridview et sous-classes
    Bonjour,

    j'aimerais pouvoir afficher dans une datagridview les sous classes, je m'explique.

    J'ai une classe(qui est la source de ma datagridview) qui contient elle même plusieurs classe dont j'aimerais afficher les propriétés.

    voici ci dessous le code ajoutant les colonnes à afficher avec les données sur ma datagridview

    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
     
            private DataGridViewColumn[] GetColumnToAdd(Type baseType)
            {
                DataGridViewColumn[] result = null;
                // Recuperer le type de la liste générique
                Type genType = dgv.DataSource.GetType().GetProperty("Item").PropertyType;
                // Créer la liste Temporaire pour contenir les propriétés à afficher
                List<PropertyDescriptor> propToDisplay = new List<PropertyDescriptor>();
                // Balayage des propriétés du type
                foreach (PropertyDescriptor propDesc1 in TypeDescriptor.GetProperties(baseType))
                {
                    // Si la propriété possède l'attribut attendu, on l'ajoute
                    if (propDesc1.Attributes[typeof(DataGridViewColumnAttribute)] != null)
                    {
                        propToDisplay.Add(propDesc1);
                    }
                    foreach (PropertyDescriptor propDesc2 in TypeDescriptor.GetProperties(propDesc1.PropertyType))
                    {
                        if (propDesc2.Attributes[typeof(DataGridViewColumnAttribute)] != null)
                        {
                            propToDisplay.Add(propDesc2);
                        }
                        foreach (PropertyDescriptor propDesc3 in TypeDescriptor.GetProperties(propDesc2.PropertyType))
                        {
                            if (propDesc3.Attributes[typeof(DataGridViewColumnAttribute)] != null)
                            {
                                propToDisplay.Add(propDesc3);
                            }
                        }
                    }
                }
     
                // si il y a des propriétés à afficher
                if (propToDisplay.Count > 0)
                {
                    // tri des champs en fonction de l'index donné
                    propToDisplay.Sort(
                        delegate(PropertyDescriptor p1, PropertyDescriptor p2)
                        {
                            return
                                (p1.Attributes[typeof(DataGridViewColumnAttribute)] as DataGridViewColumnAttribute).Index
                                .CompareTo(
                                (p2.Attributes[typeof(DataGridViewColumnAttribute)] as DataGridViewColumnAttribute).Index);
                        });
                }
                // définir la taille du tableau des colonnes à afficher
                result = new DataGridViewColumn[propToDisplay.Count];
                // 
                int counter = 0;
                //
                foreach (PropertyDescriptor propDesc in propToDisplay)
                {
                    DataGridViewColumn dgvc;
                    DataGridViewColumnAttribute dgvcAtt = (propDesc.Attributes[typeof(DataGridViewColumnAttribute)] as DataGridViewColumnAttribute);
     
                    switch (dgvcAtt.ColumnType)
                    {
                        case DataGridViewColumnType.TextBox:
                            dgvc = new DataGridViewTextBoxColumn();
                            break;
                        case DataGridViewColumnType.CheckBox:
                            dgvc = new DataGridViewCheckBoxColumn();
                            break;
                        default:
                            dgvc = new DataGridViewTextBoxColumn();
                            break;
                    }
                    dgvc.HeaderText = dgvcAtt.HeaderText != string.Empty ? dgvcAtt.HeaderText : propDesc.DisplayName;
                    dgvc.ValueType = propDesc.PropertyType.GetType();
                    dgvc.DataPropertyName = propDesc.Name;
     
                    result[counter++] = dgvc;
                }
     
                return result;
            }
    Alors, ça fonctionne bien mais uniquement pour les champs à afficher
    pour les données, seules les propriétés de premier niveau s'affiche.

    alors comment affecter les sous propriétés...

    j'espère m'etre bien fait compris

    merci de votre aide
    Alleï Bonjour chez vous!

  2. #2
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    Bonjour,

    peut-être me suis-je mal exprimé donc, et pour faire plus simple, admettons les classes suivantes
    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
     
     
    Class MamanClass
    {
     
    	private string nom;
    	private BebeClass adresse;
     
    	Public string Nom
    	{
    		get{return nom;}
    		set{this.nom=value;}
    	}
     
    	public BebeClass Adressse
    	{
    		get{return this.adresse;}
    		set{this.adresse=value}
    	}
    }
     
    class BebeClass
    {
    	private string rue;
    	private string village;
     
    	public string Rue
    	{
    		get{return this.rue;}
    		set{this.rue=value;}
    	}
    	public string Village
    	{
    		get{return this.village;}
    		set{this.village=value;}
    	}
    }
    En admettant cela, j'aimerais afficher donc dans ma datagridview qui a pour datasource une liste de classe "MamanClass"
    le nom(MamanClass) puis la rue(BebeClass), puis le village(BebeClass).

    est-ce possible ou pas? si oui, comment?

    en éspérant avoir été plus clair

    merci a tous
    Alleï Bonjour chez vous!

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 242
    Points : 296
    Points
    296
    Par défaut
    Hello,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <asp:GridView runat="server" ID="gvMain" AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField HeaderText="Maman" DataField="Nom"/>
                <asp:BoundField HeaderText="Bebe Rue" DataField="Adressse.Rue"/>
                <asp:BoundField HeaderText="Bebe Village" DataField="Adressse.Village"/>
            </Columns>
        </asp:GridView>
    En mettant en DataSource de la GridView, une liste de Maman :p

    Cela répond à ta question?

    Cordialement,
    Mafyou.

  4. #4
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    Bonjour,

    merci de ta réponse.

    En fait, pas vraiment.

    Si j'écrit quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    datagridviewcolumn.DataPropertyName="Adresse.Rue";
    ...
    Il ne me renvoie rien.

    Ou alors, je n'ai pas compris ta réponse
    Alleï Bonjour chez vous!

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 242
    Points : 296
    Points
    296
    Par défaut
    En effet, il doit y avoir un malentendu.

    Ce que je t'ais montré: Afficher une classe enfant d'une classe parent qui elle même est une liste en datasource d'une gridview.

    Toi, qu'est que tu veux?

  6. #6
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    En principe, ce que tu viens de dire

    mais admettons que je fasse cela :

    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
    public class MamanClass
        {
            private string nom = "maman";
            private BebeClass adresse = new BebeClass();
     
            public string Nom
            {
                get { return nom; }
                set { this.nom = value; }
            }
     
            public BebeClass Adresse
            {
                get { return this.adresse; }
                set { this.adresse = value; }
            }
        }
     
        public class BebeClass
        {
            private string rue = "street";
            private string village = "Oudin";
     
            public string Rue
            {
                get { return this.rue; }
                set { this.rue = value; }
            }
            public string Village
            {
                get { return this.village; }
                set { this.village = value; }
            }
        }
    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
    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                DataGridView dgv = new DataGridView();
                dgv.AutoGenerateColumns = false;
                dgv.AutoResizeColumns();
                List<MamanClass> lm = new List<MamanClass>();
                for (int i = 0; i < 10; i++)
                {
                    lm.Add(new MamanClass() { Nom = "maman", Adresse = new BebeClass() { Rue = "Beberue", Village = "Oudin" } });
                }
                dgv.DataSource = lm;
                dgv.Columns.Add("Maman_Nom", "Maman_Nom");
                dgv.Columns.Add("Bebe_Rue", "Bebe_Rue");
                dgv.Columns.Add("Bebe_Village", "Bebe_Village");
                dgv.Columns["Maman_Nom"].DataPropertyName = "Nom";
                dgv.Columns["Bebe_Rue"].DataPropertyName = "Adresse.Rue";
                dgv.Columns["Bebe_Village"].DataPropertyName = "Adresse.Village";
     
                this.Controls.Add(dgv);
            }
        }
    il ne me renvoie que la propriété nom... les deux autres champs restent vide.
    Alleï Bonjour chez vous!

  7. #7
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 242
    Points : 296
    Points
    296
    Par défaut
    Haaa du Windows Forms! Je te montrais en Asp.Net, désolé =)

    As-tu uniquement 1 seul enfant lié à ta classe mère? Ou une liste?

    -Si tu as un seul enfant par classe Mère, alors:
    Je te propose d'ajouter une propriété à ta classe mère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public string GetRueChild
            {
                get { return adresse.Rue; }
            }
    et au moment du binding de la propriété, on aura
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dgv.Columns["Bebe_Rue"].DataPropertyName = "GetRueChild";
    -Si tu as une liste d'enfant lié à une classe mère, cela va se compliquer. Le problème étant que la datagridview ne supporte pas le binding d'enfant. Malheureusement, je n'ai pas trop compris comment ils réussissent à contourner le problème.

    En espérant t'avoir aider sur ce coup,

    Cordialement,
    Mafyou.

  8. #8
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    non mais pas grave, j'avais bien compris que c'était du asp
    j'avais fait un code que j'aurais voulu équivalent
    apparemment, c'est pas le cas

    Alors ta solution, j'y avais déjà pensé et elle fonctionne évidemment... sauf que... (ben oui sinon, ce serait trop simple )

    La datagridview est "couplée" à un propertygrid.
    (donc on affiche les propriétés modifiable pour l'enregistrement sélectionné)
    si je fait ça, la propriété que j'ajoute dans la classe mere y est donc présente deux fois. Je m'explique : "Rue" apparaitrait dans l'exemple donné sous "Adresse" ET aussi simplement comme une propriété simple qui s'apellerait "Rue" aussi donc.
    Bon, ça je veux pas voir!
    Alors, mon premier reflexe est de lui mettre un attribut "Browse(false)" mais bon evidemment, ça le cache dans les deux controles...

    ...

    un grand merci d'essayer de m'aider en tout les cas
    Alleï Bonjour chez vous!

Discussions similaires

  1. un cas avec des Sous Classes
    Par Daeron dans le forum Langage
    Réponses: 7
    Dernier message: 17/01/2006, 18h39
  2. Declaré en classe de base, instancié en sous classe
    Par jobigoud dans le forum Langage
    Réponses: 3
    Dernier message: 14/11/2005, 11h55
  3. Super classes et sous-classes/Méthodes
    Par smag dans le forum Langage
    Réponses: 4
    Dernier message: 30/06/2005, 00h10
  4. [Language]constructeur de sous classes
    Par seb888 dans le forum Langage
    Réponses: 12
    Dernier message: 04/06/2005, 23h37
  5. sous-classe de JPanel ou de JSpinner ?
    Par etiennegaloup dans le forum Composants
    Réponses: 3
    Dernier message: 06/03/2005, 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