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 :

DataGridView binding personnalisé


Sujet :

C#

  1. #1
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut DataGridView binding personnalisé
    Bonjour à tous,

    Je dois modifié une fonctionnalité d'une application existante où une DataGridView est rempli sans databinding, c'est à dire par des simples

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dgv.Rows.Add();
    dgv.Rows[dvg.Rows.Count-1].Cells[0].value = value1;
    etc ...

    J'aurais bien voulu modifier le remplissage de cette datagridview par un databinding, en passant soit par une binding sur une Liste d'objets (ce que je préfères ne pas faire) soit en passant par une DataTable(solution plus propre à mon sens)

    Cependant, le binding à faire n'est pas tout simple, c'est à dire que les données à afficher ne sont pas une sélection de données dans une table SQL unique.

    Il faut récupérer des propriétés d'autres tables liées par des clés étrangères et ajouter des colonnes dans le DataGridView pour afficher des données personnalisées qui ne se trouvent pas dans la base de donnés.

    Comme cet exemple :

    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
     
    Bitmap bit = null;
    switch (Value)
    {
                            case 1:
                                bit = Library.CreateBitmapImage(Color.Blue,15,15);
                                break;
                            case 2:
                                bit = Library.CreateBitmapImage(Color.Green, 15, 15);
                                break;
                            case 3:
                                bit = Library.CreateBitmapImage(Color.Red, 15, 15);
                                break;
                            case 4:
                                bit = Library.CreateBitmapImage(Color.Orange, 15, 15);
                                break;
                            default:
                                break;
    }
    dataGridViewActivites.Rows[dataGridViewActivites.Rows.Count - 1].Cells["Marqueur"].Value = bit;
    La méthode Library.CreateBitmapImage permettant de créer une image bitmap d'une certaine couleur.

    De plus, est il possible d'assigner un object à la propriété DataBoundItem des rows ?

    Car le binding d'une DataTable assigne une DataRowView au DataBoundItem , ce qui ne m'interesse pas trop dans ce contexte ci :/

  2. #2
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    Je penses que, dans ton cas, monter des objets et les lier est plus simple.
    Sinon, j'aurais tendance à dire que ta DT doit être le résultat de tes requêtes et qu'il ne te reste plus qu'à la lier directement sans avoir à la manipuler.

    Je ne comprends pas en quoi l'utilisation d'objets te pose un problème de "propreté"... C'est une pratique courrante et nombre de déeloppeurs te dirons que la DT, c'est à chier... Beaucoup y seront favorable d'un autre côté. Pour te donner une idée, EntityFramework renvoie des objets, pas des DataTables (d'où son nom).

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut
    Oki donc je vais privilégier un binding sur une liste de mes objets. (Cependant je vais perdre le Sort automatique sur ma DataGridView )

    Cependant, comment personnaliser le binding des objets ?

  4. #4
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Par défaut
    Bonjour,
    Tu peux utilisertiliser une BindingListView :
    http://sourceforge.net/projects/blw/


    Reference : http://blw.sourceforge.net/ : "The BindingListView .NET library provides a type-safe, sortable, filterable, data-bindable view of one or more lists of objects"

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut
    Merci pour vos réponses,

    ce que j'essaye de faire actuellement c'est donc de binder une AdvancedList (trouvé ici , qui n'est autre qu'une BindingList permettant d'être trié)



    Ce projet utilise Linq To Sql, en fait je souhaites afficher une liste de prestations, qui contient une référence vers une entité Tiers, qui lui même possède une propriété Nom et une propriété NumClient.

    Via LInq, pour accéder à ces propriétés, j'y accèdes facilement via :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String NomClient = MaPrestation.Tier.Nom;
    String NumClient = MaPrestation.Tier.NumClient;
    Dans l'affichage, je ne souhaites pas afficher le Guid référencant le Tiers, mais je souhaites afficher des informations relatives à ce Tiers.
    J'essaye donc de spécifier à ces colonnes le DataPropertyName comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     DataGridViewColumn col0 = new DataGridViewTextBoxColumn();
    col0.Name = "NumClient";
    col0.HeaderText = "N° Client";
    col0.ReadOnly = true;
    col0.Visible = true;            
    col0.DataPropertyName= "Tier.NumClient";
    dataGridView1.Columns.Add(col0);
    Mais cela ne fonctionne pas, mes colonnes sont vides :/

    Que pourrais je faire ?

    Autre question, étant donné que je souhaiterais encore personnalisé mon affichage, en ajoutant une colonne qui affiche en fait un marqueur (un BitMap de couleur) qui dépend d'une propriété de ma prestation.
    Est ce que je peux initialiser ce marqueur lors de l'event RowsAdded da ma DataGridView ou dois je attendre que l'ensemble de mes rows soient chargés via le binding et donc modifier après tout les marqueurs ?

    Je dois reconnaitre que je sais pas comment m'y prendre sur ce coup là...

    Merci d'avance !

  6. #6
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Par défaut
    Citation Envoyé par Aeronia Voir le message
    Merci pour vos réponses,

    ce que j'essaye de faire actuellement c'est donc de binder une AdvancedList (trouvé ici , qui n'est autre qu'une BindingList permettant d'être trié)
    Je n'ai pas pu accéder à ce lien !!

    Je pense que vue que tu as défini le type de ton row "Tiers"
    essaye de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     col0.DataPropertyName= "Tier.NumClient";
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     col0.DataPropertyName= "NumClient";

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut
    En fait, ma liste qui va être bindée est une liste de Prestations, un objet Prestation a un objet Tier (qui possède lui une propriété Nom et une propriété NumClient)

    (Voir pièce jointe)

    Ce que je souhaites donc faire, c'est affiché les informations des prestations, et certaines informations du tiers lié à la prestation.

  8. #8
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Par défaut
    Citation Envoyé par Aeronia Voir le message
    Ce que je souhaites donc faire, c'est affiché les informations des prestations, et certaines informations du tiers lié à la prestation.
    Tu peux remplir ta bindingList par un objet "PrestationRow" Qui est formé à partir de l'objet prestation en lui ajoutant les info du tiers

  9. #9
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Par défaut
    Citation Envoyé par smaouiomar Voir le message
    Tu peux remplir ta bindingList par un objet "PrestationRow" Qui est formé à partir de l'objet prestation en lui ajoutant les info du tiers

    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
     
    public class Tier{}
        public class Prestation{}
        public class PrestationRow
        {
            public PrestationRow(Prestation p)
            {
                //Add Tier infos to PrestationRow
            }
        }
        public class PrestationRowBindingList : BindingList<PrestationRow>
        {
            private BindingList<Prestation> _source;
     
            public BindingList<Prestation> Source
            {
                get { return _source; }
                set
                {
                    _source = value;
                    //Gèrer les evenements ItemAdded ItemDeleted Reset:
                }
            }
     
            protected PrestationRow CreateRow(Prestation item)
            {
                return new PrestationRow(item);
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void test()
    {
     BindingList<Prestation> mesPrestation = new BindingList<Prestation>();
                mesPrestation.Add(new Prestation());
                mesPrestation.Add(new Prestation());
                mesPrestation.Add(new Prestation());
                mesPrestation.Add(new Prestation());
                mesPrestation.Add(new Prestation());
     
                PrestationRowBindingList maBindingListGraphique = new PrestationRowBindingList();
                maBindingListGraphique.Source = mesPrestation;
    Magrille.DataSource = PrestationRowBindingList;
    }

  10. #10
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Par défaut
    Citation Envoyé par Aeronia Voir le message
    Merci pour vos réponses,

    Autre question, étant donné que je souhaiterais encore personnalisé mon affichage, en ajoutant une colonne qui affiche en fait un marqueur (un BitMap de couleur) qui dépend d'une propriété de ma prestation.
    Est ce que je peux initialiser ce marqueur lors de l'event RowsAdded da ma DataGridView ou dois je attendre que l'ensemble de mes rows soient chargés via le binding et donc modifier après tout les marqueurs ?

    Je dois reconnaitre que je sais pas comment m'y prendre sur ce coup là...

    Merci d'avance !
    Une solution pas très clean :
    Tu peux créer une colonne bindée à ta propriété. cette colonne sera invisible.
    Tu crée une deuxième colonne de type datagridImageColumn non bindée.
    Lors du CelleFormatting tu peux déduire ta cell.Value à partir de ta propriété invisible.

Discussions similaires

  1. Ajout d'un combo sur un datagridview Bindé
    Par olibara dans le forum Windows Forms
    Réponses: 6
    Dernier message: 26/08/2009, 10h01
  2. nhnibernate et datagridview bindé sur datatable
    Par alacaraibe dans le forum C#
    Réponses: 2
    Dernier message: 23/06/2009, 17h31
  3. Creer un combobox dans un datagridview bindé
    Par olibara dans le forum Windows Forms
    Réponses: 4
    Dernier message: 28/03/2009, 20h14
  4. Sorting DataGridView binding source List<T>
    Par Leole dans le forum C#
    Réponses: 3
    Dernier message: 26/11/2008, 11h59
  5. Réponses: 1
    Dernier message: 24/07/2006, 11h51

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