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

Windows Forms Discussion :

Binding DatagrigView Get Parent column


Sujet :

Windows Forms

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 175
    Points
    175
    Par défaut Binding DatagrigView Get Parent column
    Bonjour,

    Excusez le titre un peu anglais mais pour faire court j'ai pas trouvé mieux...

    J'ai 1 dataset qui contient 2 tables reliées par 1 relation (parent/enfant)
    J'ai un DataGridView Bindé sur la table enfant.
    VS ne me donne accès qu'aux colonnes de cette table et je voudrais ajouter les colonnes de la table parent genre Parent(Relation).NomChamp. (marche pas bien sûr).

    Je sais que je peut ajouter des champs calculés dans la DT enfant pour récuperer les champs de la DT parent, mais comme j'ai besoin de tous les champs et que j'ai plein de tables, j'aimerais éviter de dupliquer ttes les colonnes.

    qq a t'il 1 autre solution ?
    merci

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    Créer une DataGridColumn capable de remonter sur la table parent avec l'index de liaison parent/enfant en redéfinissant la fonction GetFormattedValue de la classe DataGridViewCell associée.


    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
    96
    97
    98
    99
    100
    101
    102
    103
     
     
        class DataGridViewTextBoxParentColumn : DataGridViewColumn
        {
            private string strField; // Nom champ parent à atteindre
            private DataSet ds;    // DataSet contenant les 2 DataTables
            public DataGridViewTextBoxParentColumn()
                : base(new DataGridViewTextBoxParentCell())
            {
                this.strField = string.Empty;
                this.ds = null;
            }
            public DataGridViewTextBoxInterveningColumn(string strField, DataSet ds)
                : base(new DataGridViewTextBoxParentCell(strField, ds))
            {
                this.strField = strField;
                this.ds = ds;
            }
            public override DataGridViewCell CellTemplate
            {
                get
                {
                    return base.CellTemplate;
                }
                set
                {
                    // Ensure that the cell used for the template is a correct Type of Cell.
                    if (value != null &&
                         !value.GetType().IsAssignableFrom(typeof(DataGridViewTextBoxParentCell)))
                    {
                        throw new InvalidCastException("Must be a DataGridViewTextBoxParentCell");
                    }
                    base.CellTemplate = value;
                }
            }
            private DataGridViewTextBoxCell TextBoxCellTemplate
            {
                get
                {
                    return (DataGridViewTextBoxParentCell)this.CellTemplate;
                }
            }
     
        }
     
        class DataGridViewTextBoxParentCell : DataGridViewTextBoxCell
        {
            private string strField;
            private DataSet ds;
     
            public DataGridViewTextBoxParentCell()
                : base()
            {
                this.strField = string.Empty;
                this.ds = null;
                this.Style.NullValue = string.Empty;
            }
            public DataGridViewTextBoxParentCell(string strField)
                : base()
            {
                this.strField = strField;
                this.ds = ds;
                this.Style.NullValue = string.Empty;
            }
     
     
            public override object Clone()
            {
                DataGridViewTextBoxParentCell cell = base.Clone() as DataGridViewTextBoxParentCell;
                cell.strField = strField;
                cell.ds = ds;
                return cell;
            }
     
            protected override object GetFormattedValue(
                object value, 
                int rowIndex, 
                ref DataGridViewCellStyle cellStyle,
                System.ComponentModel.TypeConverter valueTypeConverter, 
                System.ComponentModel.TypeConverter formattedValueTypeConverter,
                DataGridViewDataErrorContexts context)
            {
                DataGridViewRow dgvr = this.DataGridView.Rows[rowIndex];
                object obj = null;
                try
                {
                    // Si tu as défini un DataGridColumn caché contenant l'index Parent
                    int idxParent = Convert.ToInt32(dgvr.Cells["ParentID"].Value);
     
                    // OU Si tu n'as pas défini cette colonne
                    int idxParent = Convert.ToInt32(((DataRowView)dgvr.DataBoundItem).Row["ParentID"]);
     
                    // Définir ici ton appel de fonction pour chercher ton info
                    // dans la table parent
                }
                catch // Valeur par défaut si non trouvé
                {
                    obj = "Parent inconnu";
                }
     
                return obj;
            }
        }
    Ensuite il te faut définir manuellement les colonnes de ton DatagridView en utilisant quand nécessaire ton nouveau DataGridViewColumn.

  3. #3
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 175
    Points
    175
    Par défaut
    Woaw...pas mal...
    je vais tester, mais ça parrait coooool.

    merci et bon WE...

  4. #4
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 175
    Points
    175
    Par défaut
    Merci tu m'as mis sur la bonne piste...et ça marche nikel !
    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
     
    class DataGridViewTextBoxParentCell : DataGridViewTextBoxCell
    {
        /// <summary>
        /// Surcharge la méthode de base 
        /// retourne la valeur à afficher dans la Cellule
        /// </summary>
        /// <param name="rowIndex"></param>
        /// <returns></returns>
        protected override object GetValue(int rowIndex)
        {
            object lRet = null;
            try
            {
                DataGridViewRow lRow = this.DataGridView.Rows[rowIndex]; // ne pas utiliser OwningRow : marche pas 
                if (lRow.DataBoundItem != null)
                {
                    DataGridViewTextBoxParentColumn lColumn = (DataGridViewTextBoxParentColumn)OwningColumn;
                    string lRelation = lColumn.RelationName;
                    string lField    = lColumn.DataPropertyName;
                    lRet = ((DataRowView)lRow.DataBoundItem).Row.GetParentRow(lRelation)[lField];
                }
            }
            catch 
            {
                lRet = "Champ/Relation inconnu"; // Valeur si champ ou relation n'existe pas
            }
     
            return lRet;
        }
    }
    J'ai ajouté un champ (et sa propriété) "RelationName" dans la colonne où est mémorisé le nom de la DataRelation.

    J'aimerais tester dans cette propriété que la relation choisie (en mode design ou RunTime) existe (idem pour la DataPropertyName) et j'y arrive pas.
    Je sais énumerer les DataRelations et les colonnes d'une DataTable, mais je ne sais pas comment récuperer la datatable à partir de la DataColumn...
    Merci de m'aider à boucler avant que je ne m'arrache tous les cheuveux...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    Si tu reprends mon code, tu as accès à la rangée du DataTable par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DataGridViewRow dgvr = this.DataGridView.Rows[rowIndex];
     
    DataRow row = ((DataRowView)dgvr.DataBoundItem).Row;
    puis a la DataTable contenant cette rangée par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    DataTable table = row.Table;

  6. #6
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 175
    Points
    175
    Par défaut
    C'est 1 Column et non 1 row que je dois traduire...

    Ma propriété "RelationName" qui doit tester si la relation existe est dans DataGridViewParentColumn et n'a donc pas accès aux Rows.
    De toute façon, en modes Design il n'y a pas de Rows.

    ...mais ça m'a mis sur la bonne piste, merci BEAUCOUUUUU
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DataGridViewRow lDgvRow = this.DataGridView.RowTemplate;
    DataTable lDt = ((DataRowView)lDgvRow.DataBoundItem).Row.Table;

  7. #7
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 175
    Points
    175
    Par défaut
    j'ai crié victoire trop vite...ça ne marche pas.
    Voici le code de ma fonction qui teste si la Relation existe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (this.DataGridView == null || this.DataGridView.DataSource == null)
       return true; // Devrait ret.False mais plante au chargement ...
       //...faudrait être capable de detecter qu'on est au chargement...
     
    DataTable lDt = ((DataRowView)DataGridView.RowTemplate.DataBoundItem).Row.Table;
    foreach (DataRelation lRel in lDt.ParentRelations)
        if (lRel.RelationName == pRelName) return true;
     
    return false;
    DataBoundItem est toujours null.
    que faire ??

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    RowTemplate défini le modèle pour les lignes d'un DataGridView, il est normal qu'aucun objet source ne lui soit associé.
    Je ne vois pas ou est ta fonction de test par rapport au reste, je ne m'avancerais donc pas plus loin dans ma réponse désolé.

    Par contre, la fonction GetValue est appelée à chaque affichage de cellule, c'est à dire assez souvent, y mettre un test qui ne se révèle nécessaire qu'une seule fois ne me semble pas très judicieux pour les performances.

  9. #9
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 175
    Points
    175
    Par défaut
    Comme je l'indiquais dans des 2 précédants posts, c'est la propriété "RelationName" qui le teste lors du "Set", pas GetValue...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/03/2013, 13h29
  2. [UserControl] Binding vers le parent
    Par al2000 dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 26/09/2011, 16h41
  3. Binding d'un UC avec son Parent
    Par myCollections dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 23/08/2010, 10h44
  4. Réponses: 2
    Dernier message: 27/11/2009, 11h29
  5. [VB.NET] Binding et DataRelation Vers la table parente
    Par TSalm dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/07/2006, 09h40

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