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 :

Déplacement de lignes dans une listView


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 19
    Par défaut Déplacement de lignes dans une listView
    Bonjour

    Voila mon problème : Je voudrais pouvoir modifier la position d'éléments contenus dans un ListView.

    Jusque là aucun problème.

    Ça se complique quand mes éléments sont affectés à des groupes. Si j'essaye d'ordonner les éléments à l'intérieur du groupe, l'élément que je déplace se retrouve toujours à la fin du groupe visuellement mais est bien positionné dans la liste ListViewGroup.Items

    Par exemple, si ma liste contient les éléments suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Elément 1
    Elément 2
    Elément 3
    Elément 4
    Voici le bout de code qui permet de déplacer "Element 1" vers le bas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ListViewItem item = listView.Items[0];
    ListViewGroup group = item.Group;
    listView.Items.RemoveAt(0);
    listView.Items.Insert(1, item);
    group.Items.Insert(1, item);

    group.Items possèdent alors les éléments suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Elément 2
    Elément 1
    Elément 3
    Elément 4
    Mais visuellement, je vois les éléments dans cet ordre là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Elément 2
    Elément 3
    Elément 4
    Elément 1
    "Elément 1" se retrouve à la fin au lieu d'être en 2ème position.

    J'ai essayé plusieurs solutions sans résultat (parfois même l'élément disparait)

    Quelqu'un a-t-il une idée ?

    Merci

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bonjour,

    J'ai fait un test et il apparaît que quelque soit la position dans la list d'items de la ListView cela n'a aucune influence.

    Sinon il faut penser à bien redéfinir le group de l'item après l'avoir remove car il perd le lien à ce moment là.

    Voici mon code :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WindowsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                for (int i = 0; i < 10; i++)
                {
                    ListViewGroup group = new ListViewGroup(string.Format("Group {0}", i), string.Format("Group {0}", i));
     
                    for (int j = 0; j < 5; j++)
                    {
                        ListViewItem item = new ListViewItem(string.Format("Item {0}", j));
                        item.Group = group;
                        listView1.Items.Add(item);
                    }
     
                    listView1.Groups.Add(group);
                }
            }
     
            private void Form1_Click(object sender, EventArgs e)
            {
                ListViewItem item = listView1.SelectedItems[0];
                ListViewGroup group = item.Group;
                listView1.Items.RemoveAt(listView1.SelectedItems[0].Index);
                item.Group = group;
                listView1.Items.Insert(0, item);
            }
        }
    }

  3. #3
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    J'y pense le ListView permet de faire en gros un explorateur. N'est-il pas possible de créer une colonne (info) contenant l'ordre de tes items et de trier par cette colonne (en la masquant si possible) ?

  4. #4
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 19
    Par défaut
    Merci de ta réponse

    Citation Envoyé par ostenhard Voir le message
    Sinon il faut penser à bien redéfinir le group de l'item après l'avoir remove car il perd le lien à ce moment là.
    Oui ça je sais mais le group.Items.Insert(1, item); a le même effet normalement

    Sinon le tri c'est pas une mauvaise idée oui mais on peut pas cacher les colonnes d'un ListView
    Je viens de faire le test en triant sur l'indice de l'élément après la permutation et ça marche bien (et c'est moins compliqué que de gérer une colonne supplémentaire )

    Voila le code (pour ceux que ça intéresserait)

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
     
            listView1.ListViewItemSorter = new ListViewItemComparer();
        }
     
        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < 10; i++)
            {
                ListViewGroup group = new ListViewGroup(string.Format("Group {0}", i), string.Format("Group {0}", i));
     
                for (int j = 0; j < 5; j++)
                {
                    ListViewItem item = new ListViewItem(string.Format("Item {0}", j), group);
                    listView1.Items.Add(item);
                }
                listView1.Groups.Add(group);
            }
        }
     
        private void Form1_Click(object sender, EventArgs e)
        {
            ListViewItem item = listView1.SelectedItems[0];
            ListViewGroup group = item.Group;
            listView1.Items.RemoveAt(listView1.SelectedItems[0].Index);
            item.Group = group;
            listView1.Items.Insert(0, item);
     
            listView1.Sort();
        }
     
    }
     
    class ListViewItemComparer : IComparer
    {
        public int Compare(object obj1, object obj2)
        {
            ListViewItem item1 = (ListViewItem)obj1;
            ListViewItem item2 = (ListViewItem)obj2;
            if (item1.Index < item2.Index)
                return -1;
            else if (item1.Index == item2.Index)
                return 0;
            else
                return 1;
        }
    }
    Encore merci

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

Discussions similaires

  1. Afficher un nombre fixe de lignes dans une ListView
    Par poutch dans le forum Composants graphiques
    Réponses: 3
    Dernier message: 12/08/2011, 08h14
  2. ajouter une ligne dans une listview
    Par lovedesitaliens dans le forum C#
    Réponses: 5
    Dernier message: 15/07/2010, 18h09
  3. Comment pointer une ligne dans une ListView
    Par Tolede78 dans le forum Débuter
    Réponses: 6
    Dernier message: 27/05/2009, 08h05
  4. Déplacement de ligne dans une grille
    Par Redlet dans le forum Composants VCL
    Réponses: 2
    Dernier message: 13/03/2009, 12h00
  5. Suppression d'une ligne dans une listview
    Par Spidermeu dans le forum C#
    Réponses: 6
    Dernier message: 08/09/2008, 13h59

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