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 :

Insert dans une ListView


Sujet :

Windows Forms

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut Insert dans une ListView
    Bonjour,

    Est-ce que quelqu'un ici a une astuce pour contourner le bug de la fonction Insert du ListView qui ne sait pas insérer là où on lui demande ?

    J'ai besoin d'afficher des images dans une liste et je veux permettre à l'utilisateur de réordonner ces images par drag&drop à l'intérieur de la liste. Comme l'insert ne fonctionne pas, il est impossible de faire ça.

    Papy !

  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 749
    Points
    39 749
    Par défaut
    A part vider la liste et tout ajouter à nouveau, je ne vois pas...

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    C'est quand même pas top de la part de crosoft de fournir des trucs buggés.

    Je vais voir, soit je vide tout et je recrée, soit je me fais une liste d'images à partir d'un Listbox et ça ira bien.

    Merci quand même !

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Est-ce que quelqu'un ici a une astuce pour contourner le bug de la fonction Insert du ListView qui ne sait pas insérer là où on lui demande ?
    J'ignorais l'existence de ce bug. Il apparait dans toutes les versions de framework ?

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    en tous cas, sous dans le 2.0.

    J'ai vu plusieurs messages sur le net qui en parlent. Et beaucoup de gens qui cherchent une solution à ce problème. Un Insert à l'index 0 place toujours l'élément en fin de liste. Certains intervenants disent qu'il faut rafraichir la liste parce que ça ne serait que visuel. Mais j'ai essayé, ça ne change rien.

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Je viens de faire l'essai en 3.5 SP1 (j'ai pas plus ancien sous la main) mais les Windows.Forms sont de toute manière en 2.0 (elles ont pas bougé). Et avec le bout de code suivant :


    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 ListViewItem getlvi(int i)
            {
                return new ListViewItem("TEST " + i.ToString());
            }
            private void insertInLv()
            {
     
                listView1.Items.Add(getlvi(1));
                listView1.Items.Add(getlvi(2));
                listView1.Items.Add(getlvi(3));
                listView1.Items.Add( getlvi(4));
                // move LVI pos 3 => pos 1
                ListViewItem lvi = listView1.Items[3];
                listView1.Items.Remove(lvi);
                listView1.Items.Insert(1, lvi);
            }
    J'obtiens bien

    TEST 1
    TEST 4
    TEST 2
    TEST 3
    dans la listeView. Je ne vois pas du tout de quel bug tu parles.

    Idem en forçant la compilation en 2.0 au niveau du projet.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Mon code est le suivant :

    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
     
                OpenFileDialog ofd = new OpenFileDialog();
                if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    Images images = new Images();
                    Image image = images.MakeThumbnail(ofd.FileName);
                    imageList1.Images.Add(image);
                    images = null;
     
                    listView1.BeginUpdate();
                    listView1.Items.Insert(
                        0,
                        "test" + imageList1.Images.Count.ToString(), 
                        "test" + imageList1.Images.Count.ToString(), 
                        imageList1.Images.Count - 1);
                    listView1.Refresh();
                    listView1.EndUpdate();
                }
    Chaque item ajouté se retrouve en fin de liste. Pourtant, je fais bien un insert à l'index 0. Bon, maintenant, j'ai peut-être pas placé 'index où il faut ?

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Je ne comprends pas ton soucis.

    J'ai modifé mon code de test pour faire des Insert au lieu des Add pour tout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            private ListViewItem getlvi(int i)
            {
                return new ListViewItem("TEST " + i.ToString());
            }
            private void insertInLv()
            {
                listView1.BeginUpdate();
                for(int i = 1; i < 50; i++)
                    listView1.Items.Insert(0,getlvi(i));
                listView1.EndUpdate();
           }
    Et ca fonctionne parfaitement (la liste commence bien par "TEST 49").

    Tu es sur que tu n'as pas un problème ailleurs ?

    Pour moi, je ne vois clairement aucun bug ici.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  9. #9
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    et le code du drag&drop est tiré de chez microsoft:

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
    {
        //Begins a drag-and-drop operation in the ListView control.
        listView1.DoDragDrop(listView1.SelectedItems, DragDropEffects.Move);
    }
     
    private void listView1_DragEnter(object sender, DragEventArgs e)
    {
        int len=e.Data.GetFormats().Length - 1;
        int i;
        for (i = 0; i <= len; i++)
        {
            if (e.Data.GetFormats()[i].Equals("System.Windows.Forms.ListView+SelectedListViewItemCollection"))
            {
                //The data from the drag source is moved to the target.	
                e.Effect = DragDropEffects.Move;
            }
        }
    }
     
    private void listView1_DragDrop(object sender, DragEventArgs e)
    {
        //Return if the items are not selected in the ListView control.
        if (listView1.SelectedItems.Count == 0)
        {
            return;
        }
        //Returns the location of the mouse pointer in the ListView control.
        Point cp = listView1.PointToClient(new Point(e.X, e.Y));
        //Obtain the item that is located at the specified location of the mouse pointer.
        ListViewItem dragToItem = listView1.GetItemAt(cp.X, cp.Y);
        if (dragToItem == null)
        {
            return;
        }
        //Obtain the index of the item at the mouse pointer.
        int dragIndex = dragToItem.Index;
        ListViewItem[] sel=new ListViewItem[listView1.SelectedItems.Count];
        for (int i=0; i <= listView1.SelectedItems.Count - 1; i++)
        {
            sel[i] = listView1.SelectedItems[i];
        }
        for (int i=0; i < sel.GetLength(0); i++)
        {
            //Obtain the ListViewItem to be dragged to the target location.
            ListViewItem dragItem = sel[i];
            int itemIndex = dragIndex;
            if (itemIndex == dragItem.Index)
            {
                return;
            }
            if (dragItem.Index < itemIndex)
                itemIndex++;
            else
                itemIndex = dragIndex + i;
            //Insert the item at the mouse pointer.
            ListViewItem insertItem = (ListViewItem)dragItem.Clone();
            listView1.Items.Insert(itemIndex, insertItem);
            //Removes the item from the initial location while 
            //the item is moved to the new location.
            listView1.Items.Remove(dragItem);
        }
    }

    Chaque élément déplacé se retrouve invariablement à la fin du listview

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Peut être faut il chercher dans la logique de ton code.

    Met un BP conditionel sur l'insert pour controler l'index.
    Ou mieux, fait un test en forçant l'index à 0 (ce qui inserera tout en début de liste).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  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 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    J'ignorais l'existence de ce bug. Il apparait dans toutes les versions de framework ?
    https://connect.microsoft.com/Visual...not-consistent

    Ce n'est pas un bug du framework mais un bug du contrôle Win32 (la classe ListView est juste un wrapper de ce contrôle)

    Citation Envoyé par Bluedeep Voir le message
    Je viens de faire l'essai en 3.5 SP1 (j'ai pas plus ancien sous la main) mais les Windows.Forms sont de toute manière en 2.0 (elles ont pas bougé). Et avec le bout de code suivant :

    ...

    J'obtiens bien



    dans la listeView. Je ne vois pas du tout de quel bug tu parles.
    Apparemment le bug ne se produit pas dans tous les modes... par exemple en mode Details ça doit fonctionner correctement

  12. #12
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Apparemment le bug ne se produit pas dans tous les modes... par exemple en mode Details ça doit fonctionner correctement
    Ceci explique cela !!

    J'ai fait en effet l'essai en mode détail (qui correspond à 99% des utilisations que je fait de la LV - comme de l'explorer de windows d'ailleurs, que je laisse toujours dans ce mode).

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  13. #13
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Effectivement, en mode détails, ça marche. Mais ma liste doit afficher des images (issues d'un scanner). Si je ne peux afficher que des textes, ça ne m'est pas très utile

  14. #14
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Effectivement, en mode détails, ça marche. Mais ma liste doit afficher des images (issues d'un scanner). Si je ne peux afficher que des textes, ça ne m'est pas très utile
    C'est en effet évident !

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  15. #15
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    J'ai remplacé la listview par une listbox qui affiche les images et ça ira bien.

    Merci à tous les deux !

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

Discussions similaires

  1. [VB.NET] Objet .Tag dans une ListView
    Par Lois dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/10/2004, 16h35
  2. Détection insertion dans une Table
    Par abelman dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/07/2004, 14h24
  3. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34
  4. [VB6] Supprimer un enregistrement dans une ListView ??
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/11/2002, 09h37

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