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 :

DataGridView DataSource et BindingList


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 59
    Points
    59
    Par défaut DataGridView DataSource et BindingList
    Bonjour,
    J'ai actuellement une structure qui se présente comme suit:
    -ID
    -BindingList<Key, Value>

    La source que je voudrai passer à mon DataGridView est une BindingList de cette structure mais je n'arrive pas à le faire directement. En effet, la taille de la liste dépendant des choix de l'utilisateurs, elle est dynamique et je ne peux pas créer une classe spécifique avec le bon nombre d'attributs.
    Mon problème c'est que construire un DataTable à partir de cette liste fonctionne très bien mais prend beaucoup trop de ressources mémoires par rapport à ce qui est défini dans le CDC.
    Existe-t-il un moyen simple d'avoir une liste qui contient elle-même un ID + une Liste comme DataSource d'un DataGridView sans pour autant passer par un DataSet ou un DataTable?

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Je n'ai rien compris, tu pourrais être plus clair ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    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 SaumonAgile Voir le message
    Je n'ai rien compris, tu pourrais être plus clair ?
    Idem, j'ai notamment du mal avec la BindingList<Key, Value>
    ಠ_ಠ

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 59
    Points
    59
    Par défaut
    Pour être plus clair, j'ai un objet, que l'on nommera Objet1, qui contient deux attributs: une Clé et une Valeur.

    Un deuxième objet, Objet2, contient deux attributs: un Id et une BindingList<Objet1> dont la taille dépend des choix de l'utilisateur.

    Pour finir j'ai une BindingList<Objet2> que je voudrai passer comme DataSource d'un DataGridView.

    L'utilisation d'un DataTable prenant trop de ressources mémoire, je dois utiliser un autre moyen (quitte à perdre des fonctionnalités comme le tri automatique lorsque l'on clique sur un en-tête de colonne du DataGridView).

    Est-ce plus clair comme ça?
    n'hésitez pas à redemander des précisions.

  5. #5
    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
    Si j'ai bien compris, tu as représenté un tableau sous la form d'une liste de listes, et tu voudrais présenter ça à ta grille ?
    ಠ_ಠ

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 59
    Points
    59
    Par défaut
    Plus ou moins oui, enfin la Liste de Liste est ce que je reçois d'un service, je peux casser cette structure actuelle mais je ne veux pas utiliser de DataTable.
    En gros je pourrai remplacer ça par un tableau de string à deux dimensions si ça permet de remplir le DataGridView.

  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
    Ok. Quand tu bindes une List d'objets à une DGV, elle affiche chaque objet sur une ligne, et chaque propriété sur chaque colonne.
    Ton objet doit donc avoir des propriétés. La DGV extrait les propriétés par réflexion : c'est simple si cet objet a une propriété (style string Name { get {...} set {... } } ou un champ public), c'est plus complexe s'il n'en a pas. Dans ce deuxième cas, qui est le cas de la DataRow, tu peux implémenter l'interface ICustomTypeDescriptor (cf la MSDN ) qui te permettrait au runtime de "créer" des propriétés.

    Tu peux aussi modifier ton design pour éviter d'avoir des listes de listes, c'est ce que j'aurais fait mais je connais pas toutes tes contraintes
    ಠ_ಠ

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 59
    Points
    59
    Par défaut
    OK, merci.
    Petite question sur le DataGridView, lorsque tu lui ajoute des lignes et des colonnes, derrière il crée quelque chose qui doit être très proche d'un DataTable non?

  9. #9
    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
    Disons que la grille a deux modes :
    - en mode binding, la DGV n'est qu'un "tube", elle ne contient rien et demande tout à sa DataSource. Donc en gros, avant de peindre la cellule (i,j), elle va récupérer le i-ième objet de sa dataSource, la j-ième propriété de cet objet, et applique un formatage. (un Tostring avec une chaîne de format pour une colonne textBox, une transfo true / false => Checked / pas Checked pour une colonne de type CheckBox, etc.)
    - en mode non bindé, elle contient effectivement les données. C'est pour ça qu'il y a un Add sur la propriété Rows de la grille.

    Sachant qu'on peut avoir des colonnes bindées et des colonnées non bindées simultanément.
    ಠ_ಠ

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 59
    Points
    59
    Par défaut
    et comment passer d'un mode bindé à un mode non bindé?
    Par exemple si je prends comme source un tableau à 2 dimensions qui correspond exactement à ce qui doit être affiché dans le Grid et que je suis en mode bindé, je ne devrais pas avoir une occupation mémoire trop importante, si?

  11. #11
    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 ludogoal Voir le message
    et comment passer d'un mode bindé à un mode non bindé?
    En spécifiant (ou pas) une DataSource.
    Citation Envoyé par ludogoal Voir le message
    Par exemple si je prends comme source un tableau à 2 dimensions qui correspond exactement à ce qui doit être affiché dans le Grid et que je suis en mode bindé, je ne devrais pas avoir une occupation mémoire trop importante, si?
    Comme je disais tout à l'heure, la DGV considère différemment les lignes et les colonnes : chaque ligne est un objet, chaque colonne est une propriété d'un objet. Il n'y a pas (à ma connaissance) de moyen simple de présenter dans la DGV une string[][] ou List<List<string>>.

    En mode bindé, la DGV n'a aucun objet en mémoire. Sinon, c'est elle qui contient tout.
    ಠ_ಠ

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 59
    Points
    59
    Par défaut
    Donc, si je résume pour que tu valide si j'ai tout compris:
    -Pour respecter ma problématique d'occupation mémoire, je dois forcément passer en bindé.
    -Pour être en bindé il faut que j'ai un objet qui ait une propriété par donnée (ce qui va être difficile puisque c'est l'utilisateur qui spécifie les données qu'il souhaite").

    Est-ce que, si je cré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
     
    public class Objet1
        {
            private Int _id;
            private int _code;
            private string _nom;
     
     
            public Int Id
            {
                get { return _id; }
                set { _id= value; }
            }
     
     
            public int Code
            {
                get { return _code; }
                set { _code = value; }
            }
     
            public string Nom
            {
                get { return _nom; }
                set { _nom= value; }
            }
        }
    et que je passe en DataSource de mon Grid une liste (ou bindinglist) de cet objet, je vais bien avoir une Grille de 3 Colonnes avec en en-tête Id, Code, Nom???????

    Merci d'avance pour ta réponse et pour toute l'aide que tu m'apporte sur un sujet que je ne maîtrise pas.

  13. #13
    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 ludogoal Voir le message
    Donc, si je résume pour que tu valide si j'ai tout compris:
    -Pour respecter ma problématique d'occupation mémoire, je dois forcément passer en bindé.
    De ce que je sais de ton projet, oui. A titre indicatif, t'as combien de lignes et de colonnes potentiellement ?
    Citation Envoyé par ludogoal Voir le message
    -Pour être en bindé il faut que j'ai un objet qui ait une propriété par donnée
    Ce n'est pas obligatoire : cf ce que j'ai dit sur ICustomTypeDescriptor.
    Citation Envoyé par ludogoal Voir le message
    (ce qui va être difficile puisque c'est l'utilisateur qui spécifie les données qu'il souhaite").
    Oui mais il choisit dans un ensemble de propriétés que tu connais déjà, non ? Si c'est le cas, tu crées un objet avec toutes ces propriétés, il ne te reste plus qu'à masquer les colonnes non nécessaires.

    Citation Envoyé par ludogoal Voir le message
    Est-ce que, si je crée:[SNIP]
    Oui. Teste, tu verras bien.
    ಠ_ಠ

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 59
    Points
    59
    Par défaut
    Pour répondre à ta question, j'ai potentiellement 50 000 lignes et 25 colonnes.

    Pour ce qui est du test, j'ai créé un objet avec quelques propriétés (pas les 25 encore vu que ce n'était qu'un test) et là le résultat est assez bizarre puisque la mémoire utilisée par mon application est la même que lorsque je passais par un DataTable ou que j'ajoutais toutes les données au Grid (Rows.Add).
    A voir pourquoi et s'il y a un moyen de détourner cela.
    Je pense que 50 000 lignes c'est quand même beaucoup et que passer par une pagination serait une bonne solution lorsqu'il y a beaucoup de données à afficher mais il va falloir faire valider ça....

    Merci pour ton aide.

  15. #15
    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 ludogoal Voir le message
    Pour ce qui est du test, j'ai créé un objet avec quelques propriétés (pas les 25 encore vu que ce n'était qu'un test) et là le résultat est assez bizarre puisque la mémoire utilisée par mon application est la même que lorsque je passais par un DataTable ou que j'ajoutais toutes les données au Grid (Rows.Add).
    Hum, mais attend : ces 50 000 objets à 25 propriétés, tu les crées à partir de la liste de liste dont tu parlais ou à la place de cette liste de liste ? Parce que dans le premier cas, ça revient en gros au même que ta première idée à base de DataTables.

    La DGV peut se binder à des données métier que si elles sont "bien formées". C'est à dire au minimum que chaque ligne ait des propriétés et que cette DataSource soit une IList.
    ಠ_ಠ

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 143
    Points : 59
    Points
    59
    Par défaut
    La liste de liste est retournée par un service, moi je la "transforme" en Objets à 25 propriétés et j'utilise cette liste (BindingList) d'objets à 25 propriétés comme DataSource du DataGridView.

  17. #17
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 30
    Points : 20
    Points
    20
    Par défaut DataGridView DataTable et Objet
    Bonjour,

    Je veux avoir une datagridview qui m'affiche le contenu d'une table.

    Jusque là, pas de problème : datagridview.DataSource = NomTable.

    Cette Table est issu d'une classe me permettant de ramener le contenu d'une table.
    De cette classe dérive une autre classe me permettant de travailler sur un enregistrement.

    J'aimerai que quand je rentre en modification d'une ligne dans la datagridview, je puisse travailler sur les propriétés de cette objet (la modification de la colonne Nom par exemple lance le traitement du set sur cette propriété de l'objet).

    Est-ce possible ? Si non, quelle méthode me préconisez-vous ?

    D'avance merci pour votre aide.

Discussions similaires

  1. [Débutant] DataGridView.DataSource.Sort avec chiffres et texte
    Par IL-MAFIOSO dans le forum VB.NET
    Réponses: 12
    Dernier message: 17/11/2016, 10h54
  2. DataGridView DataSource et Linq
    Par ppphil dans le forum C#
    Réponses: 9
    Dernier message: 15/09/2010, 11h27
  3. Problème de conversion Datagridview.datasource
    Par padrinho dans le forum VB.NET
    Réponses: 4
    Dernier message: 06/08/2009, 19h22
  4. Réponses: 7
    Dernier message: 03/12/2008, 16h49
  5. Réponses: 8
    Dernier message: 23/08/2006, 10h59

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