Datei Drag & Drop mehrmals einfügen

  • C#

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von KloiberJG.

    Datei Drag & Drop mehrmals einfügen

    Hallo!

    Ich bitte um Hilfe, da ich nicht mehr weiterweiss. Die Ausgangssituation ist die, dass ich ein Objekt (Datei) aus der VB-Form in ein Programm (SolidWorks, CAD-Software) ziehen will, geht auch schon. Allerdings muss ich bis jetzt jeden DragDrop Vorgang einzeln starten, indem ich mit Maus auf die Form gehe, Maus gedrückt, rüberzeihen in SW und loslassen.

    Eigentliche Frage: Kann ich (man) den Code so modifizieren, dass ich bei jedem Mausklick ein Objekt (datei) an Pos. einfüge? Bzw. den eigentlichen "Drop"-Vorgang wiederholen kann?

    (...)

    //void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

    {

    //Abfrage ob File ausgewählt wurde
    if (!System.IO.File.Exists(fName))
    {

    MessageBox.Show("No file selected");
    }


    //case 1:
    //hier verm. Datei an DD-Ereignis übergebenstring[] fList = newstring[1];
    fList[0] = fName;


    DataObject dataObj = newDataObject(DataFormats.FileDrop, fList);
     

    //hier beginnt vermutlich der eigentliche DragDrop Vorgang
    //DragDropEffects eff = DoDragDrop(dataObj, DragDropEffects.Link | DragDropEffects.Copy);

    DoDragDrop(dataObj,
    DragDropEffects.Link | DragDropEffects.Copy);

    //der einfügevorgang sollte hier per Mausklick an Mauspos. wiederholt werden

    }

    (...)

    Danke im Vorraus,

    J Kloiber
    @KloiberJG:: Willkommen im Forum. :thumbup:
    Wie auch im Explorer kannst Du auch in .NET.Programmen multiple Files per Drag&Drop behandeln.
    Dass musst Du allerdings im DragEnter-Event das Object nach String-Array casten, ansonsten isses String und da wird nur das 1. Element der Liste genommen.
    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!
    [VB.NET] Drag & Drop
    bzw. du befindest dich im falschen Forum, wenn du mit C# arbeitest.
    Stell die nächste c# Frage hier: vb-paradise.de/sonstiges/board…tere-programmiersprachen/
    erstma Bitte VB-Tag benutzen - aber richtig - ist für c# nicht anners.

    Dann willst du ja nur die Drag-Quelle programmieren, dassis die Geschichte mittm DoDragDrop().
    Dein eigliches Problem hat ja nix damit zu tun, nämlich, du willst iwie eine "SammelFunktionalität", etwa dass bei Ctr-Mousdown die geklickste Datei in eine Liste kommt.

    Das Draggen ist dann wieder dasselbe, nur dass du nicht die geklickste Datei übergibst, sondern die DateiListe.
    @Gather: *shame-on-me*, wie kann (könnte) ich den Thread verschieben? Wenn ich das mit VB programmieren würde, hätte ich dieselbe Problemstellung. C# isses weil ich den Code im Inet gefunden habe (siehe unten)

    @Alle: OK, hab amal das Projekt (ist nicht von mir, sooo gut binnich nicht) hochgeladen.

    Ich will nicht mehrere Dateien gleichzeitig verschieben/DragDroppen, sondern immer nur eine ausgewählte. Diese soll aber bei jedem Mausklick eingefügt werden (bis man ESC oder so zum Abbrechen des Vorgangs drückt).

    (Wer mit SolidWorks mal zu tun gehabt hat, kennt die Funktion "Komponente einfügen" wo man bei eben jedem Klick eine Instanz der Datei einfügt in Baugruppe)
    Dateien
    • Original.zip

      (57,63 kB, 74 mal heruntergeladen, zuletzt: )

    KloiberJG schrieb:

    OK, hab amal das Projekt
    Probier mal dies,
    schmeiß vorher die angemeckerten Zeilen in der Form1.Designer.cs einfach raus:
    D&D

    C#-Quellcode

    1. using System;
    2. using System.Windows.Forms;
    3. namespace CS_DragDrop
    4. {
    5. public partial class Form1 : Form
    6. {
    7. private string[] fName;
    8. public Form1()
    9. {
    10. InitializeComponent();
    11. }
    12. private void button1_Click(object sender, EventArgs e)
    13. {
    14. this.openFileDialog1.Multiselect = true;
    15. if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
    16. {
    17. fName = this.openFileDialog1.FileNames;
    18. }
    19. }
    20. void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    21. {
    22. if (!System.IO.File.Exists(fName[0]))
    23. {
    24. MessageBox.Show("No file selected");
    25. }
    26. DataObject dataObj = new DataObject(DataFormats.FileDrop, fName);
    27. DragDropEffects eff = DoDragDrop(dataObj, DragDropEffects.Link | DragDropEffects.Copy);
    28. }
    29. }
    30. }
    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!

    KloiberJG schrieb:

    (Wer mit SolidWorks mal zu tun gehabt hat, kennt die Funktion "Komponente einfügen" wo man bei eben jedem Klick eine Instanz der Datei einfügt in Baugruppe)

    Habich nicht - deshalb wäre es besser, du würdest vernünftig beschreiben, was dir vorschwebt. (Das ist auch die mit Abstand beste Art, programmiererisches Denken zu erlernen)
    Danke fürs Thread-Verschieben!
    @Rod: danke für den Code, werde ich testen - was meinst du mit "angemeckerte Zeilen"? Beim Starten gibt er mir keine Fehler aus.

    @Erfinder: OK, hier mal ein Versuch das Ganze zu beschreiben: Mit dem Programm will ich...

    1. Auswählen der Datei (sind Dateien im *.sldprt-Format)
    2. Ziehen der Datei von Form in Programm (Maustaste drücken & gedrückt halten -> DragDrop Vorgang gestartet -> rüberziehen -> in Programmfenster (Solidworks) Maustaste loslassen -> Datei (=Bauteil) wird eingefügt
    3. (optional) Datei hängt jetzt an Mauszeiger wie wenn man eine Datei wohinzieht bei Drag&Drop
    4. jeder Mausklick fügt die Datei da ein wo der Mauszeiger grad ist
    5. Mit z.B. Escape will ich den DragDrop Vorgang beenden

    Punkte 1 & 2 funktionieren schon.
    Ich will aber den D&D Vorgang nicht jedesmal neu starten müssen, sondern bei jedem Mausklick eine Instanz der Datei einfügen. Das ist bei Windows Ordnern nicht sinnvoll (Datei wird jedesmal überschrieben) aber im Solidworks schon, da ich in einer Baugruppe mehrere Dateien desselben Namens haben kann.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „KloiberJG“ ()

    Ja, aber das ist ja die Sache...für jeden einfügevorgang muss ich den DragDrop vorgang neu starten.
    Ausserdem wird das Programm aus einer Access-DB gestartet, die vorher den Dateipfad übergibt (das habe ich zum Laufen gebracht)
    Will mir halt unnötige Klickserei sparen, wenn zB mal 10 Schrauben (o.ä.) eingefügt werden sollen

    KloiberJG schrieb:

    Beim Starten gibt er mir keine Fehler aus.
    Hast Du Deinen Code durch meinen ersetzt?
    Ich hab die leeren Prozedurhülsen gelöscht, da meckert der Compiler diese fehlenden Prozeduren an.
    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!
    Das Ganze hat sich mittlerweile in Wohlgefallen aufgelöst, da mir ein guter Bekannter das Teil umgeschrieben hat,
    wird im Moment noch von unserem SysAdmin angepasst.
    Wenn es erwünscht ist, werde ich das Teil uploaden.

    @Rod
    Beim Compilen werden keine Fehler angezeigt...weiss leider nicht was du mit leere Prozedurhülsen meinst.
    Ich würde deinen Vorschlag gerne noch ausprobieren (interessehalber), aber ich kriegs nicht raus was zum löschen ist.
    Wenn ich deinen Code einfach so einfüge, schmeisst der Comp. Fehlermeldungen aus.
    Wäre es zuviel verlangt mir den Code bitte einfach Strg-A/C/V zu posten?

    KloiberJG schrieb:

    weiss leider nicht was du mit leere Prozedurhülsen meinst.

    Quellcode

    1. void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    2. {
    3. // Dies ist eine leere Hülse
    4. }

    Quellcode

    1. // an dieser Zeile müsste er meckern, wenn die kommunizierende Hülse weg ist
    2. this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
    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!
    @Rod: Danke, habs zum Laufen gebracht :) aber merke keinen Unterschied zum Originalprogramm ; jeder D&D Vorgang muss einzeln gestartet werden. Was hast du anders programmiert?

    Anbei einmal das Beispiel von meinem Bekannten: Starten, File auswählen, Strg-Shift-X hängt File an Mauszeiger. Unser SysAdmin schreibts gerade so um dass der Anhängevorgang automatisch (ohne Tastenkombi) läuft. (wenn die Kombi STRG-Shift-X ned geht, im Code an anderen Buchstaben einfügen; das Programm muss sichtbar am Desktop sein, damit D&Ds simuliert werden können)
    Dateien

    KloiberJG schrieb:

    Was hast du anders programmiert?

    RodFromGermany schrieb:

    C#-Quellcode

    1. this.openFileDialog1.Multiselect = true;
    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!

    Problem gelöst

    Hallo nochmals,

    im Anhang einmal die bearbeitete Version. Öffnen > File auswählen > Drag & Drop. Das Programmfenster muss im Vordergrund sein (darf nicht von anderen Fenstern verdeckt werden). Wenn man nun Strg-Shift-X drückt hängt das Objekt wieder am Mauszeiger & kann eingefügt werden, dies kann beliebig oft wiederholt werden; zum Beenden Strg-Shift-B drücken.

    LG
    Dateien
    Ja, wie gesagt ich steig auf diesem Programmier-Niveau aus. Aber es läuft, den Kollegen passts & alle sind glücklich. Credits gehen an meinen Bekannten & unseren SysAdmin (ich hab egtl. nur Arbeit koordiniert & delegiert, wie man so schön sagt). Soll/muss ich diesen Thread jetzt egtl. schliessen bzw. als erledigt markieren?

    Ein Dankeschön auch an alle die sich mit der Thematik auseinandergesetzt haben - vll. ist am Anfang nicht so rübergekommen was ich egtl. wollte, trotzdem THX!