Zum Inhalt springen

[Visual Basic .NET] Drag & Drop


Iceman346

Empfohlene Beiträge

Ich bastel momentan mal wieder und versuche folgendes hinzukriegen:

In meinem Programm ist eine ListBox, welche den Inhalt eines Verzeichnisses auflistet. Über Drag&Drop soll man nun Dateien in das Verzeichnis kopieren können und auch aus diesem Verzeichnis rausziehen können.

Ersteres klappt bereits problemlos, dass man Dateien über die Listbox wieder aus dem Verzeichnis rausziehen kann kriege ich aber nicht hin.

Ich versuchs momentan so:

Private Sub ListBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseDown

        If e.Clicks = 1 And e.Button = Windows.Forms.MouseButtons.Left Then

            ListBox1.DoDragDrop(vz & "\" & ListBox1.SelectedItem, DragDropEffects.Copy)

        End If

    End Sub

aber damit krieg ich zwar nen entsprechenden Mauszeiger beim Rausziehen, aber "Fallenlassen" kann ich die Datei nirgends.

Link zu diesem Kommentar
Auf anderen Seiten teilen

aber damit krieg ich zwar nen entsprechenden Mauszeiger beim Rausziehen, aber "Fallenlassen" kann ich die Datei nirgends.

natürlich musst du in den entsprechenden controls einen event definieren, der sich für genau dieses zuständig fühlt ;) AllowDrop, DragEnter und DragDrop wären hier ein ansatz.

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

natürlich musst du in den entsprechenden controls einen event definieren, der sich für genau dieses zuständig fühlt ;) AllowDrop, DragEnter und DragDrop wären hier ein ansatz.

Es soll halt nicht auf das Programm selber wieder gezogen werden sondern auf die Windows Oberfläche. Ergo: In dem Fenster ist ne Dateiliste, daraus klickt man eine an, zieht sie raus und kann sie dann auf dem Desktop ablegen.

Mit dem Eintrag:

ListBox1.DoDragDrop(New DataObject(DataFormats.FileDrop, vz & "\" & ListBox1.SelectedItem), DragDropEffects.Copy)

Krieg ich auch nen entsprechendes Symbol, sieht also so aus als könnte man kopieren, aber wenn ich die Maustaste loslasse passiert nichts.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Über Drag&Drop soll man nun Dateien in das Verzeichnis kopieren können und auch aus diesem Verzeichnis rausziehen können.

Ersteres klappt bereits problemlos, dass man Dateien über die Listbox wieder aus dem Verzeichnis rausziehen kann kriege ich aber nicht hin.

Hi könntest du deinen Code "Dateien in das Verzeichnis kopieren" posten, so etwas könnte ich auch gebrauchen.

Wäre Super, DANKE

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi könntest du deinen Code "Dateien in das Verzeichnis kopieren" posten, so etwas könnte ich auch gebrauchen.

Klar, nutze momentan aber nen ListView Element. Bei der ListBox ändert sich aber am Code, außer den Handles, eigentlich nichts.


    Private Sub ListView1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListView1.DragEnter

        If e.Data.GetDataPresent(DataFormats.FileDrop) Then

            e.Effect = DragDropEffects.Copy

        End If

    End Sub


    Private Sub ListView1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListView1.DragDrop

        e.Effect = DragDropEffects.Copy

        If e.Data.GetDataPresent(DataFormats.FileDrop) Then

            Dim Dateien() As String

            Dateien = e.Data.GetData(DataFormats.FileDrop)

            For Each line As String In Dateien

                If Path.GetExtension(line) = ".xml" Or Path.GetExtension(line) = ".XML" Then

                    File.Copy(line, vz & Path.GetFileName(line))

                End If

            Next

            aktualisieren()

        End If

    End Sub
Der Code ist jetzt so geschrieben, dass nur xml Dateien kopiert werden, nimmst du die "If Path.GetExtension" Anweisung raus wird alles kopiert. In der Variable vz steht das Zielverzeichnis drin. Die Funktion "aktualisieren()" sorgt dafür, dass die Dateien auch dargestellt werden, sieht so aus:

Private Sub aktualisieren()

    ListView1.Items.Clear()

        If Directory.Exists(vz) Then

            For Each line As String In Directory.GetFiles(vz)

                If Path.GetExtension(line) = ".xml" Or Path.GetExtension(line) = ".XML" Then

                    ListView1.Items.Add(Path.GetFileName(line))

                End If

            Next

    End If

End Sub

Für das Problem des Rausziehens hab ich aber immer noch keine Lösung, wenn da wer Ideen hat immer her damit :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab zwar auch nen Moment gebraucht, allerdings ist die Lösung nun erschreckend kurz...

Du musst es nur noch von C# nach VB portieren

Zum Beispiel: Ich bin auch mal von einer ListView ausgegenagen und der Vermutung das Du eventuell Dateien kopieren magst. (Für andere Datenformate ist das ganze aber ähnlich...)

Du brauchst nen Eventhandler für das Ereignis "ItemDrag"


private void listView1_ItemDrag(object sender, ItemDragEventArgs e)

{

[INDENT]DataObject obj = new DataObject(DataFormats.FileDrop, new string[] { "C:\\test.txt" });

DoDragDrop(obj, DragDropEffects.Copy);

[/INDENT]


        }

Das sorgt dafür, dass wenn Du Dein Element in den Explorer ziehst, die angegeben Datei dortin kopiert wird.

Das String-Array ist übrigens nötig, nen einfacher String der den Dateinamen enthält reicht nicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du bist nah dran mein persönlicher Held zu werden ;)

Hab das ganze nu in VB implementiert, jetzt krieg ich aber immer die Fehlermeldung, dass die Datei nicht kopiert werden kann weil die Quelldatei nicht gelesen werden kann. Und nein, die Datei ist natürlich weder woanders geöffnet, noch schreibgeschützt oder versteckt oder sonstwas.

Edit: Argl, eigener dummer Fehler. Hab vergessen, dass im ListView natürlich nur der Dateiname steht und nicht der Pfad. Ergo schnell noch den Pfad drangekittet und nu funktionierts. Du bist hiermit mein persönlicher Held :)

Der Code sieht so aus für die die es interessiert:

Private Sub ListView_ItemDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles ListView1.ItemDrag

        Dim liste(ListView1.SelectedItems.Count - 1) As String

        Dim i As Integer = 0

        For Each item As ListViewItem In ListView1.SelectedItems

            liste(i) = vz & item.Text

            i = i + 1

        Next

        Dim obj As New DataObject(DataFormats.FileDrop, liste)

        DoDragDrop(obj, DragDropEffects.Copy)

    End Sub

Bearbeitet von Iceman346
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...