DragDrop de fichier entre 2 ListView [Résolu]

Signaler
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
-
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
-
Bonjour,

Je souhaiterai réaliser une sorte d'explorer pour la copie de fichiers.
En fait, je liste dans 2 ListView différente deux répertoires et j'aimerai par drag&drop copie/déplacer les fichiers.
Actuellement j'arrive à drag&dropper le nom des fichiers mais j'aimerai transmettre un FileInfo plutot qu'un String mais je n'y arriv pas.
De plus, je voudrais n'autoriser que le drag&drop depuis ListView2 pour la ListView1 et inversement que depuis la ListView1 pour la ListView2. Actuellement, je peux faire un drag&drap de la ListView1 vers la ListView1 ce qui ne correspond pas à mon choix.

Voila où j'en suis (de 2 --> 1):

this

.listView1.AllowDrop =
true;

this.listView2.AllowDrop =
true;

private

void listView2_ItemDrag(
object sender,
ItemDragEventArgs e)
{

this.listView2.DoDragDrop(
this.listView2.SelectedItems[0].Text,
DragDropEffects.Copy);
}

private

void listView1_DragEnter(
object sender,
DragEventArgs e)
{

if (e.Data.GetDataPresent(
DataFormats.Text))
{
e.Effect =
DragDropEffects.Copy;
}
}

private

void listView1_DragDrop(
object sender,
DragEventArgs e)
{

string name = (
string)e.Data.GetData(
DataFormats.Text);

this.listView1.Items.Add(name);
}

Serez-vous m'aider à résoudre mon problème car en fait pour les fichiers ca semble être comme ça pour la réception :
private
void listView1_DragEnter(
object sender,
DragEventArgs e)
{

   if (e.Data.GetDataPresent(
DataFormats.FileDrop))
   {
      e.Effect =
DragDropEffects.Copy;
   }
}
private
void listView1_DragDrop(
object sender,
DragEventArgs e)
{

   string[] files = (
string[])e.Data.GetData(
DataFormats.FileDrop);

   foreach (
string f
in files)
   {

      this.listView1.Items.Add(f.ToString());
   }
}

Mais je ne sais pas comment faire pour l'émission, transformer mon path vers le fichier en fichier.

f.colo

8 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Petit exemple :

public class Test
{
   public FileInfo tonFileInfo = null;
   public ListView taListView = null;
}

Ensuite :

Test t = new Test();
t.tonFileInfo = ...
t.taListView = ...
DoDragDrop(t);

Puis :

Test t = (Test)(e.Data.GetData(typeof(Test)));
if(t != null)
{
   // t.tonFileInfo que tu peux utiliser
   // t.taListView que tu peux aussi utiliser
}

<hr size="2" /> VC# forever
=13319
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Si tu décides d'utiliser une structure, prend garde à ce que tu vas mettre dedans (garde à l'idée qu'une structure ne fonctionne pas avec des références, mais des copies !).
Si comme dans l'exemple tu passes un ListView complet, c'est possible que tu aies des problèmes de performances...

<hr size= "2" /> VC# forever
=13319
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Salut,

Le méthode DragDrop prend un object en argument, ce qui te permet donc de "drag and dropper" n'importe quoi. Il faut ensuite faire les cast nécessaire pour retrouver l'object envoyé.

<hr size= "2" /> VC# forever
=13319
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
Oui oui, je sus d'accord avez toi, mais mon probleme vient plutot du fait que je ne sais pas quoi envoyer pour pouvoir utiliser le format "DataFormats
.FileDrop".

Actuellement, je passe en paramètre le nom complet des fichiers à transférer, ca fonctionne mais c'est pas exactement ce que je veux faire, pour éviter d'avoir plusieur drag&drop possible. Avec un "filtre" sur "DataFormats
.FileDrop"
je peux faire un glissé/déposer depuis le bureau windos par exemple.

Merci de la réponse, mais elle ne correspond pas tout a fait à ce que je veux.

f.colo

Voilà comment je fais pour le moment.

private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
        {
            String[] fullFilesNames = new String[this.listView1.SelectedItems.Count];
            for (int i = 0; i < this.listView1.SelectedItems.Count; i++)
            {
                fullFilesNames[i] = this.localDirectory + "\" + this.listView1.SelectedItems[i].Text;
            }
            this.listView1.DoDragDrop(fullFilesNames, DragDropEffects.Copy);
        }

private void listView2_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent("System.String[]",false))
            {
                e.Effect = DragDropEffects.Copy;
            }
        }

        private void listView2_DragDrop(object sender, DragEventArgs e)
        {
            FileInfo file;
            string[] fileFullName = (string[])e.Data.GetData("System.String[]", false);
            for (int i = 0; i < fileFullName.Length; i++)
            {
                file = new FileInfo(fileFullName[i]);
                if (!File.Exists(this.remoteDirectory + "\" + file.Name))
                {
                    File.Copy(fileFullName[i], this.remoteDirectory + "\" + file.Name);
                    populateListView2();
                }
            }
        }
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Salut,
Comme je l'ai dit dans mon message précédant, la méthode DoDragDrop prend un objet en argument, ce qui à l'avantage de passer tout ce qu'on veut. Si y'a plusieurs élément à passer, on créer un nouvel object qui regroupe tout les éléments.
Ce que tu fais donc, c'est créer un nouvel object, qui contient une référence de ton object FileInfo et une référence de ton listView.

Quand tu arrives dans l'event DragDrop, tu regardes si l'object que tu reçois est du bon type, puis tu récupères ton FileInfo et la référence de ton ListView (cette dernière va te permettre de savoir si tu es sur le même ListView ou pas).

Je ne sais pas si c'est plus clair?

<hr size= "2" /> VC# forever
=13319
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
Oui, c'est tout a fait clair :)
Mais en fait je voulais créer un "DataFormats
.FileDrop"
pour faire copier un drag&drop d'un fichier depuis le bureau windows.
par contre tu marques:
Si y'a plusieurs élément à passer, on créer un nouvel object qui regroupe tout les éléments.

et:
tu regardes si l'object que tu reçois est du bon type


Ca je ne comprend pas, comment faire si l'objet est de plusieur type pour vérifier son type?

f.colo
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
Ok ok, il faut que je crée une classe contenant tous les types à transférer !
peut etre que ca marchera avec une structure...

Je te remercie, je vais faire ca alors :)

f.colo
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
2
Ok, merci du conseil :)
Je vais passer par une classe alors

f.colo