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 :

Bind de DGV cacher colonnes


Sujet :

C#

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Bind de DGV cacher colonnes
    Bonjour une question que je me pose souvent

    Je bind un Dgv a une liste via le Datasource
    Imaginons que certains champs des elements de la liste utilisent un accesseur un peu lourd mais que ce champ ne doit pas etre affiché dans le DGV

    La chose triviale a faire ce MonDgv.Columns["CetElement"].Visible=false;

    MAIS est ce que cela va faire que le dgv ne passera pas par l'accesseur de ce champ et le calcul sera evité
    Ou il y a-t-il une autre maniere d'eviter l'accession du champ ?
    Ou bien ce champ sera-il accedé de toute facon ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par olibara Voir le message
    MAIS est ce que cela va faire que le dgv ne passera pas par l'accesseur de ce champ et le calcul sera evité
    Ben c'est facile à vérifier... il suffit de mettre un breakpoint dans l'accesseur et de voir s'il est atteint

    A priori, je dirais que toutes les propriétés bindées à des colonnes sont évaluées, même si la colonne n'est pas affichée... mais faudrait tester pour en avoir le cœur net

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Ben voila

    On aura le coeur .NET a deux !
    Effectivement, (je m'en doutais un peu) toutes les prtopriétes sont accedées

    Mais j'en reviens a la question la plus intéressante :

    A ton avis un bindingsource peut eviter cela ?
    ou bien bontantpis ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Je ne pense pas qu'un BindingSource y change quoi que ce soit. Par contre, en plus de cacher les colonnes, tu pourrais les "dé-binder" en mettant le DataPropertyName à "" (chaine vide). Dans ce cas je pense que la propriété ne sera plus accédée

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut TomLev

    Ta suggestion me semblait bonne

    Mais curieusement c'est pire que tout !
    Du coup la proprieté s'affiche dans le DGV meme si le visible est a false !!

    Je vais rester a jouer avec le visible !

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par olibara Voir le message
    Mais curieusement c'est pire que tout !
    Du coup la proprieté s'affiche dans le DGV meme si le visible est a false !!


    Mais c'est bizarre ton histoire... J'ai fait le test, et chez moi la propriété n'est pas accédée si la colonne n'est pas visible (contrairement à ce que je pensais). Encore mieux: s'il y a une scrollbar horizontale qui fait que la colonne n'est pas visible, la propriété n'est accédée que quand la colonne devient vraiment visible.

    Donc je sais pas comment tu as fait ton test au départ, mais moi j'ai pas le même résultat...

    EDIT: pour ton dernier problème, je pense que AutoGenerateColumns est à true, si bien qu'il génère automatiquement les colonnes pour les propriétés qui n'en on pas. Mets le à false, ça devrait régler le problème

  7. #7
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par tomlev Voir le message


    Mais c'est bizarre ton histoire... J'ai fait le test, et chez moi la propriété n'est pas accédée si la colonne n'est pas visible
    Yep, normal, la DGV n'accède aux propriétés de sa source que lorsqu'elle formate une cellule. C'est à dire à son initialisation, quand une autre fenêtre passe devant, quand la form est retaillée, quand on scrolle, etc. Et comme elle ne formate que les cellules actuellement visibles...

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    J'investiguationne !!

    (Encore un nouveau verbe )

  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Tant qu'on est là ....

    Pas d'idées simple pour transformer une List<T> ed datatable (j'ai fait un autre post pour ca)

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par olibara Voir le message
    Tant qu'on est là ....

    Pas d'idées simple pour transformer une List<T> ed datatable (j'ai fait un autre post pour ca)
    pour quoi faire ?

    Il suffit de créer une DataTable avec une colonne pour chaque propriété de T, et de créer des lignes avec les valeurs de chaque objet de la boucle... Qu'est-ce qui te pose problème exactement ?

  11. #11
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    pour quoi faire ?
    Le bon dévellopeur est paresseux et se dit pourquoi faire a la main ce que la machine pourrait faire pour moi :

    L'interface de Bind d'une datatable est beaucoup plus complete que pour une List
    Et definir l'interface de la liste a la main c'est casse bonbon


    Il suffit de créer une DataTable avec une colonne pour chaque propriété de T, et de créer des lignes avec les valeurs de chaque objet de la boucle... Qu'est-ce qui te pose problème exactement ?
    Meme réponse

    Oui je peux faire a la main mais je me dis qu'a priori une methode pourrait analyser les propriétes accessible de la classe constituant la liste génerer des datacolonnes et la datatable donc je me demande si ce truc est prevu qq part


  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par olibara Voir le message
    L'interface de Bind d'une datatable est beaucoup plus complete que pour une List
    Et definir l'interface de la liste a la main c'est casse bonbon
    Ben il suffit de mettre une BindingSource entre la List et le DataGridView, et tu auras les fonctionnalités de filtre/tri/ajout/suppression/modification...

    Citation Envoyé par olibara Voir le message
    Oui je peux faire a la main mais je me dis qu'a priori une methode pourrait analyser les propriétes accessible de la classe constituant la liste génerer des datacolonnes et la datatable donc je me demande si ce truc est prevu qq part

    Je pense pas que ça existe. Mais c'est assez bidon à faire... Petit exemple avec une méthode d'extension (C# 3) :
    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
        public static class ListExtensions
        {
            public static DataTable ToDataTable<T>(this IEnumerable<T> lst)
            {
                DataTable table = new DataTable();
     
                Type type = typeof(T);
     
                // Récupération des propriétés
                var properties = from p in type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                                 where p.GetIndexParameters().Length == 0 // pour exclure les indexeurs
                                 && p.GetGetMethod() != null // pour exclure les propriétés write-only
                                 select p;
     
                // Création des colonnes
                foreach (PropertyInfo prop in properties)
                {
                    DataColumn column = new DataColumn(prop.Name, prop.PropertyType);
                    column.ReadOnly = (prop.GetSetMethod() == null);
                    table.Columns.Add(column);
                }
     
                // Copie des données
                foreach (T item in lst)
                {
                    DataRow row = table.NewRow();
                    foreach (PropertyInfo prop in properties)
                    {
                        row[prop.Name] = prop.GetValue(item, null);
                    }
                    table.Rows.Add(row);
                }
     
                return table;
            }
    Et pour l'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List<Foo> list = new List<Foo>();
    ...
     
    DataTable table = list.ToDataTable();
    Vu que le paramètre est de type IEnumerable<T>, ça devrait aussi marcher pour n'importe quel type de collection, pas seulement List<T>

  13. #13
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Nickel Tomlev

    Ta methode de creation des colonnes c'est exactement ce que je cherchais
    Mais je vois que tu passe par un select Linq
    Personnellement je travaille avec le FW 3.5, mais pense tu que cela va passer en 2.0 ?
    Je sais tu va me dire il n'y a qu'a forcer le target de compilation et tester

    Mais a part ca qu'en pense tu ? Et sinon quelle serait l'alternative pour parcourir les proprietés de la Classe c'est peut etre trivial mais je ne me suis encore jamais penché la dessus

  14. #14
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ben il suffit de mettre une BindingSource entre la List et le DataGridView, et tu auras les fonctionnalités de filtre/tri/ajout/suppression/modification...
    L'ennui, c'est que le bindingsource ne gère pas le tri et le filtre, il le délègue à sa DataSource ; si cette datasource est une IBindingListView (ce qui est le cas de DataTable et DataView), alors le filtre et le tri sont actifs, mais si elle n'est qu'une simple IList, c'est pas possible.

    Avec les outils fournis par le framework, le moyen le plus simple d'avoir une grille bindée et une gestion de tri/ filtre, c'est de passer par une DataTable. Perso, j'ai dû récupérer sur le net une implémentation de IBindingListView (nommée... BindingListView ) qui s'occupe de tout ça.

    olibara : pour ce qui est du parcours de propriété, c'est la méthode GetProperties de la class Type qu'il te faut. Un petit coup de typeof(TaClasse).Getproperties() et zou

  15. #15
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Tomlev


    Ben il suffit de mettre une BindingSource entre la List et le DataGridView, et tu auras les fonctionnalités de filtre/tri/ajout/suppression/modification...

    J'ai quand meme deja detecté des comportements bizares en utilisant une List via un BindingSource (pas uniquement dans le projet actuel)

    Par exemple :
    1- dans le cas présent, je n'ai pas de refresh du dgv si j'ajoute un element dans la liste, je dois remettre le datasource a null et le reassigner (avec la datatable : aucun probleme)

    2- Si je clique sur une row du DGV déja chargé avec des elements, je me rammasse un index -1 exception a un endroit tout a fait inatendu et qui n'a rien a voir avec l'evenement j'ai pas encore vraiment cherché a comprendre mais avec une datatable, pas de problème ??

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par olibara Voir le message
    Mais je vois que tu passe par un select Linq
    Personnellement je travaille avec le FW 3.5, mais pense tu que cela va passer en 2.0 ?
    Non, c'est sûr que ça passera pas...

    Citation Envoyé par olibara Voir le message
    Mais a part ca qu'en pense tu ? Et sinon quelle serait l'alternative pour parcourir les proprietés de la Classe c'est peut etre trivial mais je ne me suis encore jamais penché la dessus
    Il suffit de remplacer la requête Linq par une boucle sur le résultat de GetProperties

    Citation Envoyé par Guulh Voir le message
    L'ennui, c'est que le bindingsource ne gère pas le tri et le filtre, il le délègue à sa DataSource ; si cette datasource est une IBindingListView (ce qui est le cas de DataTable et DataView), alors le filtre et le tri sont actifs, mais si elle n'est qu'une simple IList, c'est pas possible.
    Arf... au temps pour moi
    Ca m'apprendra à dire des trucs sans vérifier

  17. #17
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    pour ce qui est du parcours de propriété, c'est la méthode GetProperties de la class Type qu'il te faut. Un petit coup de typeof(TaClasse).Getproperties() et zou
    Et ZOU effectivement

    Merci Guuhl et Tomlev !
    Un grand bol d'air dans les neurones grace a vous !!

Discussions similaires

  1. MVVM et Datagrid : definir par binding la visibilité des colonnes
    Par zax-tfh dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 19/05/2009, 15h56
  2. fonction cacher colonne tableau
    Par isa150183 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 22/07/2008, 09h47
  3. cacher colonne venant d'un query
    Par Mihalis dans le forum Bases de données
    Réponses: 2
    Dernier message: 13/09/2006, 18h50
  4. [CF][C#]Comment cacher colonne du DataGrid sous PPC ?
    Par jogrey dans le forum Windows Mobile
    Réponses: 5
    Dernier message: 15/03/2006, 14h53
  5. [VB.NET] DataSet - DataGrid - Cacher Colonne
    Par Seb.M dans le forum Windows Forms
    Réponses: 4
    Dernier message: 02/03/2005, 12h37

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