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 :

Custom object dans une Datagridview


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Custom object dans une Datagridview
    Bonjour,

    Je travaille sur un projet winforms avec .NET 3.5.

    J'ai un objet defini comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct ImageValue
    {
    	Bitmap _image;
    	string _value;
    };
    J'ai aussi une datatable dt bindee a ma datagridview dg.
    Mon idee est la suivante: je veux etre capable de mettre mon objet dans une row, afficher l'image contenue dans la propriete _image dans la datagridview et pouvoir filtrer via la propriete _value.

    Je fais en sorte que je puisse mettre mon objet dans la datagridview
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dt.Columns.Add("STATE", typeof(ImageValue));
    Dans la datagridview, s'affiche alors le nom de l'objet : ImageValue
    L'affichage utilise donc la methode ToString() de Object.

    Et lorsque je veux filtrer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dt.DefaultView.RowFilter = "STATE = '" + value + "'"
    Ca ne fonctionne pas car la dataview ne sait pas filtrer sur un objet de type ImageValue

    Il y aurait il un moyen d'utiliser la propriete _value de mon objet pour le filtrage (et sorting aussi)? Et la propriete _image pour l'affichage?

    La seule methode que j'ai en tete serait de creer une classe heritant de datacolumn pour l'affichage, et datarow pour le filtrage, mais celle ci est fastidieuse.
    Y'a t-il une interface ou methode specifique a implementer?

    Merci pour l'aide que vous m'apporterez.

  2. #2
    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
    Hello,

    est-ce que tu veux associer toujours la même image à la même valeur ?

    Parce qu'à ce moment là, tu laisses juste la valeur dans ta table, et tu surcharges le dessin / tu surcharge la DataGridViewImageColumn pour afficher l'image associée à cette valeur.
    Il me semble aussi que l'utilisation de TypeConverters pourrait faire l'affaire.

    Il faut bien distinguer le métier de l'UI. La datatable contient des données métier, et la DataGridView se charge de la restituer graphiquement.
    ಠ_ಠ

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Hello,

    est-ce que tu veux associer toujours la même image à la même valeur ?
    Oui.

    Citation Envoyé par Guulh Voir le message
    Parce qu'à ce moment là, tu laisses juste la valeur dans ta table, et tu surcharges le dessin / tu surcharge la DataGridViewImageColumn pour afficher l'image associée à cette valeur.
    Justement, quand j'utilise ce snippet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.currentPages.Columns.Add("STATE");
    La colonne est automatiquement du type DataGridColumn (je ne suis pas sur du type, mais elle est formatee pour afficher une chaine de caracteres)
    D'ailleurs, quelle methode est ce que je devrais surcharger pour afficher l'image?

    Citation Envoyé par Guulh Voir le message
    Il me semble aussi que l'utilisation de TypeConverters pourrait faire l'affaire.
    J'en ai jamais entendu parler.

    Citation Envoyé par Guulh Voir le message
    Il faut bien distinguer le métier de l'UI. La datatable contient des données métier, et la DataGridView se charge de la restituer graphiquement.
    J'en suis bien conscient.

    Oui, pour etre plus clair, je veux afficher une image dans la datagridview selon le texte qui est contenu dans la datatable.
    Etant donne que je cree la datatable et la remplis avec du texte, ma datagridview des colonnes de type DataGridViewTextBoxColumn.

    J'ai pense a implementer la methode/event CellFormatting pour forcer l'affichage de l'image. Rien n'y fait, c'est le texte "System.Drawing.Image" qui apparait.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 15
    Points
    15
    Par défaut Solution
    Hello,

    J'ai fini par m'en sortir, voici la solution :

    On cree des classes customs :

    Une classe pour la cellule en question :
    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 class CustomDataGridViewImageCell : DataGridViewImageCell
        {
            public CustomDataGridViewImageCell()
            {
                // Lui quel type de donnee sera entree dans la datatable
                this.ValueType = typeof(string);
            }
     
            protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, TypeConverter valueTypeConverter, TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
            {
                /* On affiche l'image selon la valeur de value */
            }
     
            // Cette propriete sert a remplacer l'image quand l'image est manquante
            // [X]    
            public override object DefaultNewRowValue
            {
                get
                {
                    return "";
                }
            }
        }
    Et une autre pour la colonne qui va les contenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class CustomDataGridViewImageColumn : DataGridViewImageColumn
        {
            public CustomDataGridViewImageColumn()
            {
                // On lui dit quel type de cellule sera present dans la colonne
                this.CellTemplate = new CustomDataGridViewImageCell();
                // Et on lui donne le type qui sera dans les cellules (utiles pour le tri)
                this.ValueType = typeof(string);
            }
        }
    Puis il reste plus qu'a preciser le type de colonne dans l'interface de construction de la forme. On oublie pas de preciser "DataPropertyName".
    Je ne vais pas m'etaler dessus.
    (Binding DataGridView <-> DataTable)

    Voici les liens qui m'ont aide a trouver une solution:

    http://msdn.microsoft.com/en-us/magazine/cc163669.aspx (Figure 5)

    http://social.msdn.microsoft.com/For...-6be5550151e1/

    Voila, c'est resolu.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/04/2007, 08h52
  2. Afficher une collection d'objets dans une datagridview
    Par thorgal1612 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/04/2007, 17h38
  3. Réponses: 2
    Dernier message: 19/04/2007, 16h57
  4. Réponses: 1
    Dernier message: 01/09/2006, 20h13
  5. [VS2005][VB.Net] Custom Format dans un DataGridView
    Par Vonotar dans le forum VB.NET
    Réponses: 10
    Dernier message: 22/11/2005, 08h15

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