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

Silverlight Discussion :

Comment peupler un DataGrid sans utiliser de liste d'objets ?


Sujet :

Silverlight

  1. #1
    Invité
    Invité(e)
    Par défaut Comment peupler un DataGrid sans utiliser de liste d'objets ?
    Bonjour tout le monde,

    Je viens de commencer à programmer en C# .NET 4. Avec WPF, j'utilise un DataSet et un DataTable pour stocker et modifier dynamiquement mes données. Seulement voilà, en Silverlight, la DataGrid ne peut pas être bindée à un DataSet, puisque cela n'existe tout simplement pas.

    Et puisque je compte créer des fonctions pour ajouter facilement colonnes et lignes, de manière à personnaliser la grille, je ne peux pas utiliser la méthode avec une instance d'une classe qui représente une ligne.

    Existe-t-il donc une alternative pour peupler ma DataGrid ?

    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Je n'ai rien trouvé de très clair là dessus, je trouve ça bizarre que personne ne se soit réellement penché sur la question.

    J'ai quand même trouvé ça qui semble parler de la même chose que moi :

    http://weblogs.asp.net/nadeemiqbal/a...d-binding.aspx

    http://www.simple-talk.com/dotnet/.n...jects-in-.net/

    M'enfin je n'ai pas tout compris.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par Yetix Voir le message
    Et puisque je compte créer des fonctions pour ajouter facilement colonnes et lignes, de manière à personnaliser la grille, je ne peux pas utiliser la méthode avec une instance d'une classe qui représente une ligne.
    Pourquoi?

    Dans la mission ou je suis, j'ai reproduit le tableau croisé dynamique d'excel (avec choix des axes de regroupement toussa toussa). Tout est dynamique.
    L'astuce en fait, consiste à créer un type via la reflection. Je dis pas que c'est simple mais en tout cas c'est faisable
    PS: Je vois arriver la question: non je ne peux pas partager le code car c'est confidentiel mais si tu veux un tuyaux, va sur les forums de telerik et cherche DynamicClass

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci de vos réponses.

    Micka -> J'avais déjà trouvé ce site, mais il me semblait que le composant était payant. Cela dit, même s'il est gratuit, je ne pourrais peut-être pas utilisé un composant qui n'est pas libre.

    Nathanael -> Quand j'ai posté le message hier, je croyais justement que ce n'était pas possible comme ça puisque je n'imaginais même pas que l'on pouvais créer des types objets dynamiquement. Après mes recherches, c'est la voie sur laquelle je me suis retrouvé effectivement.

    En tout cas, merci de vos tuyaux, je vais fouiller.

    EDIT : Le lien que m'a donné Micka me laisse perplexe. En fait cela semble gratuit et en plus on a accès au code source, mais je n'arrive pas à voir les "terms & conditions" quand je clique dessus en pied de page ça me ramène à "Get started". Est-ce que quelqu'un saurait si c'est bien open-source ou non ?

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par Yetix Voir le message
    Merci de vos réponses.

    Micka -> J'avais déjà trouvé ce site, mais il me semblait que le composant était payant. Cela dit, même s'il est gratuit, je ne pourrais peut-être pas utilisé un composant qui n'est pas libre.

    Nathanael -> Quand j'ai posté le message hier, je croyais justement que ce n'était pas possible comme ça puisque je n'imaginais même pas que l'on pouvais créer des types objets dynamiquement. Après mes recherches, c'est la voie sur laquelle je me suis retrouvé effectivement.

    En tout cas, merci de vos tuyaux, je vais fouiller.

    EDIT : Le lien que m'a donné Micka me laisse perplexe. En fait cela semble gratuit et en plus on a accès au code source, mais je n'arrive pas à voir les "terms & conditions" quand je clique dessus en pied de page ça me ramène à "Get started". Est-ce que quelqu'un saurait si c'est bien open-source ou non ?
    http://blogs.telerik.com/vladimirenc...lications.aspx
    http://www.codeproject.com/KB/cs/DynamicClass.aspx

  7. #7
    Invité
    Invité(e)
    Par défaut
    Merci pour les liens Nathanel. Je n'aurai pas trouvé sur le blog de Telerik.
    Et pour le second lien je l'avais déjà.

    Mais tout cela est un peu nouveau pour moi.

    Pour le moment j'essaye déjà de faire marcher la classe DataSet trouvée ici : http://silverlightdataset.net/silver...t/Default.aspx

    Seulement il ne veut absolument pas binder les données.


    Voici ce que je fais en C# :

    Code c# : 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
    // On initialise le tableau de données
                donnees = new DataSet();
                DataTable table = new DataTable(DataTableNom);
                donnees.Tables.Add(table);
     
                // Important, sinon les colonnes seront en double !
                this.AutoGenerateColumns = true;
     
                DataColumn col = new DataColumn("test");
                col.DataType = System.Type.GetType("System.String");
                this.donnees.Tables[DataTableNom].Columns.Add(col);
     
                DataRow row1 = table.NewRow();
                row1["test"] = "plop";
                table.Rows.Add(row1);
     
                this.DataContext = donnees;

    Et dans mon XAML :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <sdk:DataGrid x:Class="SilverlightGrid.SilverGrid"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
        mc:Ignorable="d"
     
        HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible" SelectionMode="Extended"
        RowHeaderWidth="15" RowHeight="25" ItemsSource="{Binding datas}"
        >
     
        </sdk:DataGrid>

  8. #8
    Invité
    Invité(e)
    Par défaut
    Me revoilà, j'ai également essayé la technique de Nathanael, mais là pareil, je n'arrive même pas à faire marcher le sample fournit sur le site.

    Je ne comprends vraiment pas comment m'en servir. De plus, il semble que cela utilise des composants telerik, que je ne peux pas utiliser.

    Est-ce que quelqu'un pourrait m'expliquer en français quelle est la technique de la création dynamique de types objets svp ?

  9. #9
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par Yetix Voir le message
    Me revoilà, j'ai également essayé la technique de Nathanael, mais là pareil, je n'arrive même pas à faire marcher le sample fournit sur le site.

    Je ne comprends vraiment pas comment m'en servir. De plus, il semble que cela utilise des composants telerik, que je ne peux pas utiliser.

    Est-ce que quelqu'un pourrait m'expliquer en français quelle est la technique de la création dynamique de types objets svp ?
    Je peux m'y pencher brièvement ce weekend si mon planning me permet. Ca me fera un article de blog tiens

  10. #10
    Invité
    Invité(e)
    Par défaut
    Merci, pendant ce temps je vais continuer de rechercher.

    Je viens de trouver un truc : est-ce que la création de types anonymes permettrait de résoudre ce problème ?
    J'ai l'impression que c'est une partie du problème mais peut-être que je me trompe complètement.

    En fait je suis en stage... je pense que quand j'aurai tout terminé j'écrirai un article histoire de ne pas oublier tout ça et peut-être aussi aider les débutants comme moi...

  11. #11
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par Yetix Voir le message
    Merci, pendant ce temps je vais continuer de rechercher.

    Je viens de trouver un truc : est-ce que la création de types anonymes permettrait de résoudre ce problème ?
    J'ai l'impression que c'est une partie du problème mais peut-être que je me trompe complètement.

    En fait je suis en stage... je pense que quand j'aurai tout terminé j'écrirai un article histoire de ne pas oublier tout ça et peut-être aussi aider les débutants comme moi...
    Pour les DataSet il semble effectivement ce sont les types anonymes et le mot clef dynamic de Silverlight et C#4 qui sont impliqués la dedans.

  12. #12
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Tu peux binder des expendoObject si tu veux faire cela rapidement.

    Pas besoin de créer de types comme ça

  13. #13
    Invité
    Invité(e)
    Par défaut
    Merci Anthyme pour ta suggestion. J'ai essayé, mais il ne semble pas qu'en utilisant une list d'objets dynamiques, le AutoGenerateColumns fonctionne.

    Qu'à cela ne tienne, j'ai trouvé un script qui permet de récupérer comme un bourrin les noms des propriétés pour en faire manuellement des colonnes.

    Les colonnes sont bien créées, par contre le binding ne fonctionne absolument pas. Et pourtant on a bien le nombre de lignes correspondant.

    Code c# : 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
    List<dynamic> list = new List<dynamic>();
     
                for (int i = 0; i < 10; i++)
                {
                    // On crée un objet dynamique
                    dynamic row = new ExpandoObject();
                    // Auquel on ajoute les propriétés que l'on veut
                    row.Id = i;
                    row.Nom = "Jahier";
                    row.Prenom = "Tristan";
     
                    list.Add(row);
                }
     
                grid.ItemsSource = list;
     
                // Since there is no guarantee that all the ExpandoObject's have the
                // same set of properties, get the complete list of distinct property names
                // this represents the list of columns
                IEnumerable<IDictionary<string, object>> rows = grid.ItemsSource.OfType<IDictionary<string, object>>();
                IEnumerable<string> columns = rows.SelectMany(d => d.Keys).Distinct(StringComparer.OrdinalIgnoreCase);
                foreach (string text in columns)
                {
                    // now set up a column and binding for each property
                    DataGridTextColumn column = new DataGridTextColumn();
                    column.Header = text;
                    Binding b = new Binding();
                    b.Path = new PropertyPath(text);
                    column.Binding = b;
     
                    grid.Columns.Add(column);
                }

    D'ailleurs, au vue des ressources que ça pompe, je pense que c'est une solution à écarter.
    Dernière modification par Invité ; 20/04/2011 à 11h21.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Me revoilà, un peu plus éclairé que la dernière fois.

    J'ai trouvé ceci :
    http://www.scottlogic.co.uk/blog/col...onary-updated/

    Je n'ai pas entièrement compris comment ça marche, mais le côté positif c'est que j'ai au moins de quoi remplir ma DataGrid.

    J'ai commencé à l'adapter et j'aimerais le rendre plus dynamique et plus stable aussi. Mais c'est une bonne base et je conseille cet article à tout les débutants comme moi.

    Par contre, mon problème n'est pas encore vraiment résolu.
    Je voudrais savoir si la méthode que je présente plus haut est bonne ?
    Ou plutôt si c'est la meilleure ou non. En terme de performance et de maintenance surtout.
    Vaut-il la peine que je fasse une méthode de création de types dynamiques ?

    Merci.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Depuis, j'ai avancé et j'ai trouvé 2 autres solutions, qui fonctionnent mieux :

    http://blog.bodurov.com/How-to-bind-...of-IDictionary
    (Solution robuste mais pas facilement manipulable)

    http://slbindabledatagrid.codeplex.com/
    (Solution que j'ai choisie, se rapproche bcp du DataSet de WPF).

    On va donc dire sujet résolu.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/10/2014, 19h15
  2. Réponses: 10
    Dernier message: 18/01/2013, 14h44
  3. Comment ouvrir son Programme sans utiliser Dev-C++?
    Par Neferious dans le forum Dev-C++
    Réponses: 8
    Dernier message: 21/07/2008, 14h22
  4. creer et utiliser une liste d'objets (TObjectList)
    Par Babylonne dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/11/2007, 23h27
  5. comment développer en struts sans utiliser plugin easystrut
    Par ouadie99 dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 23/01/2007, 09h39

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