c#: "Drag and Drop" Feature von anderen Programmen nicht möglich.

  • WPF

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Bluespide.

    c#: "Drag and Drop" Feature von anderen Programmen nicht möglich.

    Hallo,

    ich habe ein c# Projekt, welche eine temporärer Ordner ist.
    Von meinem Desktop oder von einem Ordner kann ich Problemlos Dateien in diesen Ordner reinziehen.

    Wenn ich allerdings einen ZIP Ordner im Exporer öffne, dann kann ich diesen nicht ins Panel ziehen.
    Wie kann dies ermöglicht werden?

    Ich meine ich kann sonst ja auch aus einem Zip Ordner eine Datei in einen Ordner ziehen..

    Danke für eure Hilfe.

    Viele Grüße

    Hier mal ein Kurzes Video vom Problem:
    *Unnötiges Vollzitat entfernt*

    So sehen die folgenden Funktionen aus:


    C#-Quellcode

    1. private void listView_DragDrop(object sender, DragEventArgs e)
    2. {
    3. // Can only drop files, so check
    4. if (!e.Data.GetDataPresent(DataFormats.FileDrop))
    5. {
    6. return;
    7. }
    8. string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
    9. foreach (string file in files)
    10. {
    11. string dest = HomeFolder + "\\" + Path.GetFileName(file);
    12. bool isFolder = Directory.Exists(file);
    13. bool isFile = File.Exists(file);
    14. if (!isFolder && !isFile) // Ignore if it doesn't exist
    15. continue;
    16. try
    17. {
    18. switch (e.Effect)
    19. {
    20. case DragDropEffects.Copy:
    21. if (isFile) // TODO: Need to handle folders
    22. File.Copy(file, dest, false);
    23. break;
    24. case DragDropEffects.Move:
    25. if (isFile)
    26. File.Copy(file, dest, false);
    27. break;
    28. case DragDropEffects.Link: // TODO: Need to handle links
    29. break;
    30. }
    31. }
    32. catch (IOException ex)
    33. {
    34. MessageBox.Show(this, "Failed to perform the specified operation:\n\n" + ex.Message, "File operation failed", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    35. }
    36. }
    37. RefreshView();
    38. // this.Opacity = 0.1;
    39. }
    40. private void listView_ItemDrag(object sender, ItemDragEventArgs e)
    41. {
    42. string[] files = GetSelection();
    43. if (files != null)
    44. {
    45. DoDragDrop(new DataObject(DataFormats.FileDrop, files), DragDropEffects.Copy | DragDropEffects.Move /* | DragDropEffects.Link */);
    46. // DoDragDrop(new DataObject(DataFormats.FileDrop, files), DragDropEffects.Move /* | DragDropEffects.Link */);
    47. RefreshView();
    48. }
    49. // this.Opacity = 0.1;
    50. }
    51. //First
    52. private void listView_DragOver(object sender, DragEventArgs e)
    53. {
    54. if (!e.Data.GetDataPresent(DataFormats.FileDrop))
    55. {
    56. e.Effect = DragDropEffects.None;
    57. return;
    58. }
    59. if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)
    60. {
    61. e.Effect = DragDropEffects.Move;
    62. }
    63. Point pt = listView.PointToClient(new Point(e.X, e.Y));
    64. ListViewItem itemUnder = listView.GetItemAt(pt.X, pt.Y);
    65. /////////////////////////////////////////////////////////////////////////
    66. }



    Und im Listview das Dragenter:

    C#-Quellcode

    1. private void listView_DragEnter(object sender, DragEventArgs e)
    2. {
    3. //if (this.Location.X > 1034 && this.Location.X == 1350)
    4. //{
    5. // autohide();
    6. //}
    7. // this.Visible = true;
    8. // if (e.Data.GetDataPresent(DataFormats.FileDrop))
    9. // e.Effect = DragDropEffects.All;
    10. // else
    11. // e.Effect = DragDropEffects.None;
    12. this.Opacity =1 ;
    13. // autohide();
    14. }


    *C#-BBCode korrigiert*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @44488232 Willkommen im Forum. :thumbup:
    Bitte keine Vollzitate von Posts über Deinen.
    Was passiert, wenn Du diesen ZIP-Inhalt auf den Explorer ziehst?
    Kommt er dort an?
    ====
    Dein DragEnter sollte so aussehen:

    C#-Quellcode

    1. private void listView_DragEnter(object sender, DragEventArgs e)
    2. {
    3. if (e.Data.GetDataPresent(DataFormats.FileDrop))
    4. e.Effect = DragDropEffects.All;
    5. else
    6. e.Effect = DragDropEffects.None;
    7. }


    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Um welches Format handelt es sich denn, wenn solch eine Datei (ist es dann überhaupt ein FileDrop?) auf dein Formular gezogen wird?

    docs.microsoft.com/de-de/dotne…_Forms_DragEventArgs_Data
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Schau mal zur Laufzeit in die EventArgs was da tatsächlich als DataFormat ankommt. Weil wenn das was anderes als DataFormats.FileDrop ist funktioniert dein Code nicht.

    Zudem müsstes du die Datei sowieso erstmal entzippen bevor du damit weiter arbeiten kannst, dass passiert nämlich nicht automatisch.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Folgendes:
    WinForm, folgender Code:
    Spoiler anzeigen

    C#-Quellcode

    1. using System.Windows.Forms;
    2. namespace WindowsFormsApp1
    3. {
    4. public partial class Form1 : Form
    5. {
    6. public Form1()
    7. {
    8. InitializeComponent();
    9. listView1.AllowDrop = true;
    10. }
    11. private void listView1_DragEnter(object sender, DragEventArgs e)
    12. {
    13. if (e.Data.GetDataPresent(DataFormats.FileDrop))
    14. e.Effect = DragDropEffects.All;
    15. else
    16. e.Effect = DragDropEffects.None;
    17. }
    18. private void listView1_DragDrop(object sender, DragEventArgs e)
    19. {
    20. string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
    21. foreach (string file in files)
    22. {
    23. listView1.Items.Add(file);
    24. }
    25. }
    26. }
    27. }
    D&D aus dem Explorer funktioniert.
    ZIP aus dem Explorer auf das Programm mit Explorer als ZIP-Viewer geht nicht.
    ZIP aus dem Salamander auf das Programm bringt folgende Fehlermeldung:

    ZIP aus dem Salamander auf den Explorer funktioniert.
    ZIP aus dem Salamander auf den Salamander funktioniert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @mrMo: Wie kann ich das eingehende DataFormat erkennen. Im Debug modus konnte ich kein Option hierfür finden.
    Ich habe hinter diesem Drop Listview ein temporären Ordner gesetzt. Ich möchte das er die Datei einfach nimmt und in den Ordner legt.
    So als würde ich per drag and Drop die datei in ein manuell erstellten Ordner auf dem Desktop ziehen.
    Schau mal in meine Signatur zum Thema Debuggen. Du kannst im EventArgs Objekt sehen aus was das besteht und dort glaub auch die DataFormats. Evtl. stellt das Objekt auch eine Methode zur Ermittlung der selbigen bereit.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @44488232 Es geht, nur wissen wir momentan nicht, wie.
    Welches ZIP-Tool verwewndest Du?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Technisch sicher möglich. Nur nicht ganz trivial, vor allem wenn man im programmieren noch nicht so fit ist um sich in die Thematik einzuarbeiten.

    Ich für meinen Teil müsste mich erst an den PC setzen und mich einarbeiten ins Thema ZIP. Daher kann ich nur Hinweise/Tipps geben und Vermutungen äußern, denen du nachgehen musst. Wenn du mit denen nichts anfangen kannst weil dir (noch) das Fachwissen dafür fehlt, dann wird eine Hilfestellung hier über das Forum sehr schwer… evtl. lass einfach dieses eine Feature weg und mach mit was anderem weiter.

    Übrigens ist ein sehr großer Teil im Leben eines Entwicklers, sich in unbekannte Themen/Techniken einzuarbeiten. Dies gelingt deutlich besser und erfolgreicher, indem man sich eine solide Grundlage an Wissen erarbeitet und dieses immer weiter ausbaut und anwendet.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Drag and Drop from Windows Compress Files

    Anscheint ist das nicht so einfach (hat mrMo ja schon geschrieben) und auch nicht direkt von .Net unterstützt. Es kommt das "FileContents" Format an, wenn man aus dem Zip des Explorers eine Datei zieht.
    In dem Link ist ein grober Beispiel-Code nach dem Motto: brain dead code, It has no error checking and doesn't free up all the resources it used, aber das gibt einem ja die richtige Richtung vor:

    C#-Quellcode

    1. if (e.Data.GetDataPresent("FileContents"))
    2. {
    3. var dataObject = (Com.IDataObject) e.Data;
    4. var formatetc = new Com.FORMATETC();
    5. Com.STGMEDIUM stgmedium;
    6. formatetc.cfFormat = (short) RegisterClipboardFormat("FileContents");
    7. formatetc.tymed = Com.TYMED.TYMED_ISTREAM;
    8. formatetc.lindex = 0;
    9. dataObject.GetData(ref formatetc, out stgmedium);
    10. Com.IStream istream = (Com.IStream) Marshal.GetTypedObjectForIUnknown(stgmedium.unionmember, typeof(Com.IStream));
    11. Com.STATSTG stat;
    12. istream.Stat(out stat, 1);
    13. byte[] temp = new byte[stat.cbSize];
    14. istream.Read(temp, temp.Length, IntPtr.Zero);
    15. }