Drag&Drop, tutorial ?

[Résolu]
Signaler
Messages postés
191
Date d'inscription
mercredi 11 juillet 2007
Statut
Membre
Dernière intervention
30 juin 2011
-
Messages postés
191
Date d'inscription
mercredi 11 juillet 2007
Statut
Membre
Dernière intervention
30 juin 2011
-
Bonjour, je souhaite pouvoir effectuer des opération de drag&drop entre une listview et l'environnement exterieur à l'application (explorateur windows, fichiers sur le bureau.. etc)

Sauriez vous m'expliquer brièment le mode de fonctionnement ou me conseiller un tutoriel pour débuter ? Il ne m'a semblé trouver que des exmples de drag&drop ente 2 listbox..

Merci par avance,
Cordialement,
Anz.

6 réponses

Messages postés
191
Date d'inscription
mercredi 11 juillet 2007
Statut
Membre
Dernière intervention
30 juin 2011

Je vous remercie de l'attention que vous avez bien voulu me porter, j'ai finalement, réussi.. :)

Pour ceux que ça interesse:

private void set_dragdrop()
        {
            listtwo.AllowDrop = true;
            listtwo.DragEnter += new DragEventHandler(listtwo_DragEnter);
            listtwo.DragDrop += new DragEventHandler(listtwo_DragDrop);
            listtwo.MouseDown += new MouseEventHandler(listtwo_MouseDown);
            listtwo.MouseUp += new MouseEventHandler(listtwo_MouseUp);
        }

        void listtwo_MouseUp(object sender, MouseEventArgs e)
        {
            ismousedown = false;
        }

        void listtwo_MouseDown(object sender, MouseEventArgs e)
        {
            ismousedown = true;
        }

        void listtwo_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.All;
        }

        void listtwo_DragDrop(object sender, DragEventArgs e)
        {
            if (ismousedown == false)
            {
                string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
                foreach (string file in files)
                {
                    listtwo.Items.Add(Path.GetFileName(file));
                }
            }
        }

Ce n'est peut-être pas optimal, mais c'est tellement moins compliqué que tout ce que l'on peut trouver sur le net.... du moins c'est mon avis.

Sur ce, merci.

Cordialement,
Anz.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
Messages postés
191
Date d'inscription
mercredi 11 juillet 2007
Statut
Membre
Dernière intervention
30 juin 2011

Merci à toi pour ta réponse rapide, mais j'avoue n'avoir pas entièrement compris les codes présentés dans tes liens.

J'ai cru comprendre que pour pouvoir drop un item sur ma listview ces lignes suffisaient:

private void set_dragdrop()
        {
            listtwo.AllowDrop = true;
            listtwo.DragEnter += new DragEventHandler(listtwo_DragEnter);
          
        }

void listtwo_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.Text))
                e.Effect = DragDropEffects.Copy;
            else
                e.Effect = DragDropEffects.None;
        }

Or mon curseur affiche toujours le symbole indiquant qu'il est impossible d'effectuer une opération de drag&drop...
De plus saurais-tu m'expliquer l'utilité de la listView2 dans ton premier lien ?.

Merci par avance,
Cordialement,
Anz.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
C'est un drag & drop entre deux listview dans cet exemple, c'est pour ça qu'il y en a deux
Après relecture de ton message, j'ai un blanc: je ne sais plus si on peut faire du drag&drop avec des éléments qui sont externes à l'application avec cette méthode ou s'il faut procéder autrement...

<hr />
-My Blog-
Messages postés
191
Date d'inscription
mercredi 11 juillet 2007
Statut
Membre
Dernière intervention
30 juin 2011

Up,

Je n'ai pas cessé de chercher, donc voici mes avancées, j'ai procédé autrement et je parviens à avoir un curseur correct lorsque je glisse un fichier sur ma listview:

private void set_dragdrop()
        {
            listtwo.AllowDrop = true;
            listtwo.DragEnter += new DragEventHandler(listtwo_DragEnter);
            listtwo.DragDrop += new DragEventHandler(listtwo_DragDrop);
            listtwo.MouseDown += new MouseEventHandler(listtwo_MouseDown);
            listtwo.DragOver += new DragEventHandler(listtwo_DragOver);
        }

        void listtwo_DragOver(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.All; 
        }

        void listtwo_MouseDown(object sender, MouseEventArgs e)
        {
            DoDragDrop(((ListView)sender), DragDropEffects.All); 
        }

        void listtwo_DragDrop(object sender, DragEventArgs e)
        {
            string textBox1 = e.Data.GetData(DataFormats.Text).ToString();
            string[] items = textBox1.Split(',');
            listtwo.Items.Add(new ListViewItem(items, 0));
        }       

        void listtwo_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.All; 
        }

Cependant, je remarque 2 problèmes:

1) le plus évident: ce la ne fonctionne pas, aucun item n'est ajouté à ma listview
2) lorsque je clique une fois dans ma listview, en déplaçant ma souris un cadre de selection se créé.. pourquoi ?

En vous remerciant de votre compréhension,

Anz.
Messages postés
191
Date d'inscription
mercredi 11 juillet 2007
Statut
Membre
Dernière intervention
30 juin 2011

Ceci n'est pas du flood :)
Mais ayant farfouillé un peu partout et soucieux de réussir une opération de drag and drop, je suis enfin parvenu à quelquechose qui n'est toujours pas au point. Je m'explique.

Pour le moment, l'opération précise que je cherche à réaliser est la suivante: ajouter à une listview de nom d'un fichier que je fait glisser depuis l'exterieur de mon application vers la listview.

Voici ce qui fonctionne (plus ou moins):

public bool ismousedown;

private void set_dragdrop()
        {
            listtwo.AllowDrop = true;
            listtwo.DragEnter += new DragEventHandler(listtwo_DragEnter);
            listtwo.DragDrop += new DragEventHandler(listtwo_DragDrop);
            listtwo.MouseDown += new MouseEventHandler(listtwo_MouseDown);
            listtwo.MouseUp += new MouseEventHandler(listtwo_MouseUp);
        }

        void listtwo_MouseUp(object sender, MouseEventArgs e)
        {
            ismousedown = false;
        }

        void listtwo_MouseDown(object sender, MouseEventArgs e)
        {
            ismousedown = true;
        }

        void listtwo_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.All;
        }

        void listtwo_DragDrop(object sender, DragEventArgs e)
        {
            if (ismousedown == false)
            {
                ListFormats(e.Data);
            }
        }

private void ListFormats(IDataObject data)
        {
            string[] formats = data.GetFormats();

            foreach (string s in formats)
            {
                this.listtwo.Items.Add(s);
            }
        }

Ce que j'obtiens:

Me sont listés les items suivant dans ma list view le chaines de caractère suivantes:
- Shell IDList Array
- Shell Object Offsets
- DragImageBits
- DragContext
- InShellDragLoop
- FileDrop
- FileNameW
- FileName

J'imagine que c'est normal étant donné que j'effectue l'opération qui permet de récupérer les formats (code trouvé sur le net), cependant j'aimerais pouvoir effectuer la même chose avec la liste des noms de fichiers glissés...

Voilà, voilà, j'espère avoir été clair :s

Cordialement,
Anz