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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    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 : 44
    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
    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 averti
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    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 : 44
    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
    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 averti
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    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 : 44
    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
    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 averti
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    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

  8. #8
    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 : 44
    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
    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

  9. #9
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    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

  10. #10
    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 : 44
    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
    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();
            }

  11. #11
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    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.

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

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