Drag&Drop, tutorial ?

Résolu
cs_ansizak Messages postés 191 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 30 juin 2011 - 22 juil. 2008 à 21:59
cs_ansizak Messages postés 191 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 30 juin 2011 - 23 juil. 2008 à 14:29
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

cs_ansizak Messages postés 191 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 30 juin 2011
23 juil. 2008 à 14:29
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.
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
22 juil. 2008 à 23:34
0
cs_ansizak Messages postés 191 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 30 juin 2011
23 juil. 2008 à 11:00
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.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
23 juil. 2008 à 11:34
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-
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ansizak Messages postés 191 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 30 juin 2011
23 juil. 2008 à 11:37
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.
0
cs_ansizak Messages postés 191 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 30 juin 2011
23 juil. 2008 à 13:23
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
0
Rejoignez-nous