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 :

Affichage d'une ListView


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 12
    Points
    12
    Par défaut Affichage et manipulation d'une DataGridView
    Bonjour,

    Je programme en C# sous Visual Studio 2005.
    Je suis pas mal débutant, niveau programmation mais surtout en ce qui concerne les interfaces graphiques.

    Mon problème est avec l'utilisation de "ListView",

    Alors voilà, j'ai fait un petit programme en C# pour enregistrer une liste d'objets (List<T>) en fichier XML et pour lire le fichier XML et le transformer en liste d'objets. Mes objets ce sont des aliments, caractérisées par leur nom "Nom" (string), leur nombre de calories "Calories" (double) et la portion "Portion" (double)... je rajouterais bien d'autres caractéristiques plus tard, c'est juste un premier essai pour voir.

    Je suis entrain de faire l'interface graphique et je voudrais afficher cette liste avec un ListView.
    Comment faire pour remplir le ListView avec le contenue de ma liste ?? Je n'y arrive pas...
    J'ai consulté MSDN mais ça ne m'aide pas ben ben...

    merci de votre aide !!

    Marie

  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 754
    Points
    39 754
    Par défaut
    Il y a plusieurs façons de faire...
    Soit tu ajoutes les éléments un par un à la liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach(Aliment a in listeAliments)
    {
        ListViewItem lvi = new ListViewItem(a.Nom);
        lvi.Tag = a; // ça permet de récupérer l'aliment correspondant à un élément de la ListView
        listView1.Items.Add(lvi);
    }
    Soit tu utilises le data binding : tu mets ta liste dans la propriété DataSource de la ListView, en indiquant quel champ doit être affiché:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    listView1.DataSource = listeAliments;
    listView1.DisplayMember = "Nom";

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Merci de la réponse !!

    Waaa la méthode 2 ce serait vraiment ça que je souhaite faire !
    Mais je viens d'essayer et... ça ne marche pas !

    Voici les erreurs :

    'System.Windows.Forms.ListView' does not contain a definition for 'DataSource'
    'System.Windows.Forms.ListView' does not contain a definition for 'DisplayMember'

    En fait, les propriétés que tu me dis d'utiliser n'existent pas on dirait !??
    Qu'ai-je oublié de faire ?

  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 754
    Points
    39 754
    Par défaut
    non tu n'as rien oublié... c'est moi qui me suis planté
    Le contrôle ListView n'a pas ces propriétés, mais le contrôle ListBox les a. Evidemment c'est moins "joli", mais ça marche...
    Quel genre d'affichage veux-tu obtenir ? Une bête liste avec du texte pour chaque élément ? Une liste avec des grandes icônes ? Une grille avec les détails de chaque élément ?

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    ok !
    Je vais aller voir ce que c'est la listbox !

    Ce que je voudrais faire, c'est afficher les éléments de la liste avec leurs valeurs, du genre :

    Aliment Calories Portion
    Carotte 100 0.5
    Jambon 50 1
    Oeuf 75 1

    Bon après je voudrais rajouter quelques autres colonnes qui correspondront à d'autres propriétés de mes objets.

    Puis dans le futur, quand j'aurais résolu le problème de l'affichage, j'aimerais pouvoir sélectionner certains éléments parmi la liste (par exemple avec des check box) afin de pouvoir faire des opérations dessus (comme composer un menu repas, additionner les calories, etc...). Et enfin quand j'aurais composé un repas je voudrais l'enregistrer sous forme de liste d'aliments là aussi et le sauver en XML... voilà toute l'histoire.

    Aussi si dans ma listeView ou ListBox, si je peux classer les éléments en cliquant sur une colonne (exemple pour les classer par ordre alphabétique ou pour la classer par valeur ascendante en calories ect...), ce serait tip top génial... mais bon j'imagine que ça doit être ultra compliqué de faire ça lol...

    merci pour les réponses !

    Marie

  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 754
    Points
    39 754
    Par défaut
    OK... tu as demandé la lune, la voici
    Le contrôle DataGridView est exactement ce qu'il te faut. Un peu plus complexe qu'une ListBox ou ListView, mais beaucoup plus puissant... et il gère déjà la plupart des fonctionnalités que tu veux (tri selon tel ou telle colonne, checkboxes...)

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Salut,

    Le DataGridView c'est formidable on dirait, on peut faire plein de trucs avec ça.
    J'ai réussit à afficher le titre des colonnes en cliquant sur une petite flèche sur le composant dans l'interface graphique, qui permet alors de choisir le "Data Source".
    Bon c'est cool tout cela mais... j'en suis toujours au même point, c'est à dire que je n'arrive pas plus à remplir les lignes du magnifique "DataGridView" avec le contenu de ma liste d'objets aliments.... :S

    merci de me donner encore des conseils !!!

    Marie

  8. #8
    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
    Dans l'événement Load de ton formulaire, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monGridView.DataSource = maListedeQuelquechose;
    monGridView est le nom de ton datagridview, et maListedeQuelquechose est ta liste List<T> dont tu parles dans ton premier post.

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    MERCIIIIIiii !!!!

    ça marche !!!

  10. #10
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Salut !

    Encore une question de newbies mais... et dans l'autre sens ?

    Pour enregistrer dans une list<T> ce que j'écris dans le DataGridView, c'est possible ? Quelle serait la "commande" ?

    merci infiniment ! Vous m'aidez beaucoup !

    Marie

  11. #11
    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 754
    Points
    39 754
    Par défaut
    Citation Envoyé par astrolus Voir le message
    Pour enregistrer dans une list<T> ce que j'écris dans le DataGridView, c'est possible ? Quelle serait la "commande" ?
    C'est automatique... mais il faut passer par une BindingSource pour que ça marche :
    1. Dans le designer, pour la propriété DataSource, tu affiches la liste déroulante, tu cliques "Ajouter la source ..."
    2. Tu choisis une source de type objet, puis tu sélectionnes ta classe Aliment
    3. Normalement ça crée un composant BindingSource qui s'appelle alimentBindingSource
    4. Dans le code, au lieu d'assigner ta liste à la DataSource de la DataGridView, tu l'assignes à la DataSource de alimentBindingSource

    La datagrid affiche maintenant une ligne supplémentaire commençant par une étoile (pour ajouter de nouveaux éléments), et si tu sélectionnes une ligne entière et cliques sur Suppr, elle est supprimée. La List<Aliment> reflète automatiquement les modifications

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Waaouu ça marche super bien ! Exactement ce que je voulais !
    Merci !!!

    Bon j'en suis maintenant à l'étape suivante (hé ben ça avance plus vite que prévu !!!) : j'essai de trouver comment pouvoir ordonner les colonnes en cliquant sur le nom de la colonne. Si vous avez des trucs ?

    merci encore !

    Marie

  13. #13
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    J'ai essayé de faire trier selon l'ordre alphabétique des noms lorsqu'on clique sur la première colonne en faisant :

    dataGridView1.Sort(nomDataGridViewTextBoxColumn, ListSortDirection.Ascending);

    mais cela me donne une erreur :

    DataGridView control cannot be sorted if it is bound to an IBindingList that does not support sorting.

    Je pense qu'il est impossible de trier le tableau étant donné qu'il s'agit d'une liste d'objets "aliment" donc pour trier selon le nom de l'aliment, le programme devrait aller regarder les objets de la liste, un à un, entrer dedans pour regarder la propriété "nom"... vous voyez ce que je veux dire ? Je ne sais pas si c'est possible ça... :S

  14. #14
    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 754
    Points
    39 754
    Par défaut
    Bien sûr, tout est possible... enfin presque
    Ce tutoriel devrait t'aider:
    http://msdn2.microsoft.com/en-us/library/ms993236.aspx

  15. #15
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    ça avance, ça avance... mais j'ai encore un problème...

    J'aimerais pouvoir trier par colonne, en cliquant sur l'en-tête de chaque colonne que cela trie selon cette colonne.

    J'ai fabriqué les fonctions qui font ce tri et elles fonctionnent bien mais le problème qui se pose est d'associer le clik sur chaque en-tête de colonne à chaque fonction de tri que j'ai créé.

    Voici ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                aliments.trierParNom();
     
                dataGridView1.Refresh();
            }

    Cela marche mais peu importe sur quel colonne je clique, alors que je voudrais que ça le fasse UNIQUEMENT si je clique sur la colonne "Nom" (la première).

    Avez-vous des idées pour ça ?

    merci !!

    Marie

  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 754
    Points
    39 754
    Par défaut
    Normal, l'évènement ColumnHeaderMouseClick se déclenche quand tu cliques sur n'importe quelle colonne... Il faut tester sur quel colonne on a cliqué :

    (en supposant que tes colonnes s'appellent colNom, colCalories, colPortion...)
    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
            private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                DataGridViewColumn col = dataGridView1.Columns[e.ColumnIndex];
                switch(col.Name)
                {
                    case "colNom":
                        aliments.trierParNom();
                        break;
                    case "colCalories":
                        aliments.trierParCalories();
                        break;
                    ...
                    default:
                        break;
                }
                dataGridView1.Refresh();
            }

  17. #17
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    ah ah merci ! encore une fois c'était tout simple mais je ne savais pas que ça existait ! lol
    Il me manquait ceci :
    DataGridViewColumn col = dataGridView1.Columns[e.ColumnIndex];
    ...pour pouvoir identifier les colonnes une à une.

    Maintenant ça marche !
    Je passe à l'étape suivante : enregistrer des ajouts et modifs.

  18. #18
    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 754
    Points
    39 754
    Par défaut
    Citation Envoyé par astrolus Voir le message
    Il me manquait ceci :
    DataGridViewColumn col = dataGridView1.Columns[e.ColumnIndex];
    ...pour pouvoir identifier les colonnes une à une.
    D'une manière générale, tous les évènements dans Windows Forms on un paramètre qui donne les informations utiles sur l'évènement. Pour voir les infos disponibles il te suffit de taper "e." (en supposant que le paramètre s'appelle e), l'intellisense affichera la liste des membres.

  19. #19
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Ca avance bien !
    J'aurais encore besoin de votre aide pour les checkbox dans la datagridview !

    Voilà j'ai ajouté une colonne de checkbox et j'aimerais pouvoir cocher les aliments de la liste que je veux transférer dans une nouvelle recette (une autre liste, qui sera affichée ailleur).

    Mais là, pas moyen de trouver comment accéder à l'état (coché ou non) de cellules de la colonne de checkbox.


    Voici par exemple la fonction que j'essai de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      private void BoutonAjouterAlimentaRecette_Click(object sender, EventArgs e)
            {
                for(int i =0; i<dataGridViewAliments.Rows.Count;i++)
                {
                    if(dataGridViewAliments.Rows[i].Cells[10].State == checked)
                    {
                        alimentsAjouter.AlimentsList.Add(aliments.AlimentsList[i]);
                    }
                }
            }
    La ligne qui ne fonctionne pas et pour laquelle j'ai essayé sans succès divers syntaxes est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(dataGridViewAliments.Rows[i].Cells[10].State == checked)
    Pouvez vous m'aider encore là-dessus ?

    merci infiniment !!

    Marie

  20. #20
    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 754
    Points
    39 754
    Par défaut
    Ca ne risque pas de marcher, checked est un mot clé du langage, qui n'a rien à voir avec les checkbox...

    La propriété State ne te donne pas d'infos sur le fait que la cellule soit cochée ou non. Il faut vérifier si la valeur de la cellule est true (cochée) ou false (non cochée). cf. la doc de la classe DataGridViewCheckBoxCell

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2007] affichage dans une listview
    Par grisan29 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/11/2011, 06h39
  2. Problème d'affichage dans une ListView
    Par tabbabi dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 10/08/2011, 12h58
  3. Force close après l'affichage d'une ListView
    Par Cuillere dans le forum Composants graphiques
    Réponses: 7
    Dernier message: 27/08/2010, 14h28
  4. Affichage d'une listView
    Par sicilianadev dans le forum C#
    Réponses: 0
    Dernier message: 24/05/2009, 14h47
  5. Réponses: 8
    Dernier message: 12/05/2006, 14h04

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