DragDrop de fichier entre 2 ListView

Résolu
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 - 18 mai 2006 à 14:08
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 - 19 mai 2006 à 11:19
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

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
19 mai 2006 à 09:26
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
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
19 mai 2006 à 11:17
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
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
18 mai 2006 à 14:59
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
0
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 2
18 mai 2006 à 15:39
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();
                }
            }
        }
0

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

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
18 mai 2006 à 20:29
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
0
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 2
19 mai 2006 à 09:18
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
0
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 2
19 mai 2006 à 10:42
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
0
cs_fcolo Messages postés 201 Date d'inscription mercredi 8 février 2006 Statut Membre Dernière intervention 20 février 2007 2
19 mai 2006 à 11:19
Ok, merci du conseil :)
Je vais passer par une classe alors

f.colo
0
Rejoignez-nous