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

C# Discussion :

Drap'n'drop d'une ListView vers l'explorer ou le bureau


Sujet :

C#

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Drap'n'drop d'une ListView vers l'explorer ou le bureau
    Bonjour,

    j'essai de faire un drag'n'drop entre une ListView et un endroit autre que mon application, entendez par la l'explorer, ou le bureau de Windows.

    Voici une partie du XAML

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <ListView x:Name="ligneFichier" DockPanel.Dock="Top" Margin="-10,65,10,0" AllowDrop="true" Drop="ligneFichier_Drop">
       <ListView.View>
          <GridView>
             <GridViewColumn x:Name="enteteNomReel" DisplayMemberBinding="{Binding nomReelFichier}"/>
             <GridViewColumn x:Name="enteteNomFichier" DisplayMemberBinding="{Binding nomFichier}"/>
             <GridViewColumn x:Name="enteteDateCreation" DisplayMemberBinding="{Binding dateFichier}"/>
             <GridViewColumn x:Name="enteteVersion" DisplayMemberBinding="{Binding versionFichier}"/>
          </GridView>
       </ListView.View>
    </ListView>
    Pour l'instant le fait de glisser un fichier sur la ListView fonctionne, je récupère le path complet du fichier via:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private void ligneFichier_Drop(object sender, DragEventArgs e)
    {
       if (e.Data.GetDataPresent(DataFormats.FileDrop))
       {
          string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
          MessageBox.Show("Fichier: " + files[0]);
       }
    }
    Maintenant je cherche à faire l'inverse, cliquer sur une ligne de ma ListView et la glisser hors de mon application sur une fenetre d'explorer, ou sur le bureau de Windows. Tout ce qu'il me faut c'est récupérer le répertoire sur lequel je fini mon drag'n'grop (quand je relâche le bouton de la souris), ensuite je créerai mon fichier dans ce répertoire etc...

    Autant j'ai trouvé facilement le fait de glisser un fichier vers mon application, autant je galère à trouver une solution simple pour l'autre sens.

    Avez-vous une idée ?

    Merci par avance !

  2. #2
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Voici des liens dont je me suis inspiré pour implémenter jadis un D&D en techno WPF :

    http://codebrewery.blogspot.fr/2010/...views.html?m=1

    https://stackoverflow.com/questions/...f-onto-desktop

    Et qqch de tres instructif pour implémenter la copie de fichiers volumineux :

    http://dlaa.me/blog/post/9913083

    a+

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Windows 10
    Bonjour et merci pour les liens.

    Malheureusement j'utilise Windows 10 et les exemples ne fonctionnent pas sous cet OS.

    Je développe sous Visual 2017 community et je m'étonne qu'une fonctionnalité aussi utilisé que le Drag'n'Drop n'ai pas été implémenté d'une façon simple !

    Bref je continue mes recherches...

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut En utilisant des trucs à gauche à droite...
    Bonjour,

    en prenant des idées sur différents sites, j'ai réalisé une façon de faire qui fonctionne sous Windows 10, en passant par un fichier temporaire mais je crois que c'est encore la solution la plus simple.

    Alors dans le XAML, pour ma ListView, je rajoute deux événements sur l'appuie du bouton droit et le mouvement de la souris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ListView x:Name="ligneFichier" DockPanel.Dock="Top" Margin="-10,65,10,0" AllowDrop="true" Drop="ligneFichier_Drop" MouseLeftButtonDown="ligneFichier_MouseLeftButtonDown" MouseMove="ligneFichier_MouseMove" RenderTransformOrigin="0.568,0.479">
    Je rajoute dans le code source:

    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
    private Point start;
    private void ligneFichier_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
       this.start = e.GetPosition(null);
    }
     
    private void ligneFichier_MouseMove(object sender, MouseEventArgs e)
    {
       if (e.LeftButton == MouseButtonState.Pressed) // Sinon cela deconne car ma ListView a aussi un evenement DROP dessus (on peux y déposer des fichiers)
       {
          ListView parent = (ListView)sender;
          object data = parent.SelectedItems;
          System.Collections.IList items = (System.Collections.IList)data;
          var collection = items.Cast<Ligne>();
          if (data != null)
          {
             List<string> filePaths = new List<string>();
             foreach (Ligne l in collection)
             {
                filePaths.Add(new System.IO.FileInfo(l.nomFichierTemporaire).FullName);
             }
             DataObject obj = new DataObject();
             System.Collections.Specialized.StringCollection sc = new System.Collections.Specialized.StringCollection();
             sc.AddRange(filePaths.ToArray());
             if (sc.Count > 0) // Sinon exception a la ligne obj.SetFileDropList(sc); qui n'accepte pas de liste vide
             {
                obj.SetFileDropList(sc);
                DragDrop.DoDragDrop(parent, obj, DragDropEffects.Copy);
             }
          }
       }
    }
    Le nomFichierTemporaire est pour l'instant renseigné à la main (c'est un programme que de commence)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<Ligne> items = new List<Ligne>();
    items.Add(new Ligne() { nomReelFichier = "NOM_REEL", nomFichier = "NOM_FICHIER", dateFichier = "12/10/2017", versionFichier = "0.1", nomFichierTemporaire = @"G:\CUISINE.JPG" });
    items.Add(new Ligne() { nomReelFichier = "NOM_REEL2", nomFichier = "NOM_FICHIER2", dateFichier = "12/10/2017", versionFichier = "0.1", nomFichierTemporaire = @"G:\CUISINE2.JPG" });
    items.Add(new Ligne() { nomReelFichier = "NOM_REEL3", nomFichier = "NOM_FICHIER3", dateFichier = "12/10/2017", versionFichier = "0.1", nomFichierTemporaire = @"G:\CUISINE3.JPG" });
    ligneFichier.ItemsSource = items;
    Voila, il ne me reste plus qu'a créer le fichier temporaire après le "drop", je ne sais pas trop encore comment faire, peut-être peut-on surveiller ce fichier temporaire pour le créer d'abord vide sur le bureau puis ensuite le remplir...

    Bonne journée !

  5. #5
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Citation Envoyé par Mercenary Developer Voir le message
    Voila, il ne me reste plus qu'a créer le fichier temporaire après le "drop", je ne sais pas trop encore comment faire, peut-être peut-on surveiller ce fichier temporaire pour le créer d'abord vide sur le bureau puis ensuite le remplir...
    Pour surveiller un fichier ou un répertoire il y a une classe FileSystemWatcher qui permet d'écouter des événements sur le système de fichier. Je ne sais pas si ça peut t'être utile, mais tu peux aussi regarder du côté de MemoryMappedFile qui permet de manipuler une zone mémoire comme un fichier, afin d'éviter des allez-retours disque dur pour l'utilisation d'un fichier temporaire.

Discussions similaires

  1. copie le contenu d'une listview vers un fichier txt
    Par dolsky dans le forum VB.NET
    Réponses: 4
    Dernier message: 03/12/2008, 12h30
  2. Drag&Drop d'une treeview vers elle-même
    Par fredonouille dans le forum Windows Forms
    Réponses: 2
    Dernier message: 17/05/2008, 17h55
  3. Drag & Drop : D'une application vers une appli java
    Par elfiestador dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 01/08/2007, 00h45
  4. Réponses: 0
    Dernier message: 24/07/2007, 13h22
  5. [VB.NET]Drag and Drop dans une Listview
    Par gégécap dans le forum Windows Forms
    Réponses: 5
    Dernier message: 23/08/2006, 18h41

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