Drag'n'Drop in ListBox
-
Hi Forum!
Habe die letzten 2 Std vergeblich versucht folgende Funktionalität in mein
Win Forms Programm zu implementieren,vielleicht kann mir jemand von euch helfen:- Mein Programm besteht aus einem Fenster und einer ListBox.
- Der Benutzer soll in der Lage sein,eine beliebige Datei von ausserhalb meiner
Anwendung per Drag and Drop auf die ListBox zu ziehen.- Beim ziehen auf die ListBox soll den ListBox Items der Zielpfad der gedroppten
Datei hinzugefügt werden! Hierbei ist zu beachten, dass der Benutzer auch
mehrere Dateien gleichzeitig per Drag and Drop auf die Liste ziehen könnte.- Das wars,mehr soll nicht erledigt werden.
Quellcode kann ich leider nicht posten,da ich keinen blassen Schimmer habe,wie diese Funktionalität zu verwirklichen ist.
Für jegliche Tips,Anregungen und Hinweise bin ich außerordentlich Dankbar!
Probiert habe ich bisher die Events DoDrag und DragDrop der ListBox zu behandeln,wie in der MSDN beschrieben. Allerdings tut sich beim Droppen auf
meine ListBox überhaupt nichts. Ich vermute fast,weil ich versuche ein Objekt von außerhalb meiner Anwendung zu Draggen.(P.S.: JA - ich habe die Eigenschaft AllowDrop der ListBox auf true gesetzt!)
MfG
Dexter1982
-
Diese Zeil am besten in den Konstruktor oder so:
this->DragDrop += gcnew System::Windows::Forms::DragEventHandler(this, &Worksheet::ReceiveDragDrop);
Dann diese Methode deklarieren:
System::Void ReceiveDragDrop(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) { // Überprüfe ob der übergebene Drag&Drop-Datensatz das richtige Datenformat hat (hier String) if(e->Data->GetDataPresent(System::Windows::Forms::DataFormats::StringFormat)) { // Cast in den gewünschten Datentyp (hier String) String^ newModelName = dynamic_cast<String^>(e->Data->GetData(System::Windows::Forms::DataFormats::StringFormat)); //Und jetzt die Daten reinpacken wo du willst. }
-
Das sieht nicht schlecht aus,aber welche Klasse bezeichnet &Worksheet in deiner ersten Codezeile? So kann ich es nicht kompilieren,weil er den Bezeichner Worksheet nicht kennt!
MfG
Dexter1982
-
Herr Latz schrieb:
Diese Zeil am besten in den Konstruktor oder so:
this->DragDrop += gcnew System::Windows::Forms::DragEventHandler(this, &Worksheet::ReceiveDragDrop);
Habe deine obige Zeile mit Worksheet als Bezeichner mal durch folgendes
(hoffentlich richtiges) ersetzt:this->DragDrop += gcnew System::Windows::Forms::DragEventHandler(this, &Form1::ReceiveDragDrop);
Ausserdem habe ich die AllowDrop-Eigenschaft meines Forms ebenfalls auf true gesetzt.
Dann habe ich in die Eventbehandlung des DragDrop Ereignisses deine obige Funktion ReceiveDragDrop übernommen und den String mit folgender Anweisung an die ListBox übergeben:
//Und jetzt die Daten reinpacken wo du willst. lstPlaylist->Items->Add(newModelName);
Ergebnis des ganzen:
Wird eine Datei über dem Formular per Drag and Drop gezogen passiert: NICHTS.Das ganze ist kniffliger als ich dachte und ich hatte gehofft mit .NET würde es ein Kinderspiel sein....
Hat denn keiner mal so eine Funktionalität in seinem Program gebraucht und kann mir helfen?
MfG
Dexter1982
-
Ok, dein Fenster heist Form1?
Und die Listbox lstPlaylist?
dann:
this->lstPlaylist->DragDrop += gcnew System::Windows::Forms::DragEventHandler(this, &Form1::ReceiveDragDrop);
du willst ja das DragDropevent der Listbox haben und nicht von deinem Fenster.
dann mußt du schaun ob e->Data->GetDataPresent überhaupt die if-Bedingung erfüllt:if(e->Data->GetDataPresent(System::Windows::Forms::DataFormats::StringFormat))
(mit dem debuger durchlaufen)
sonst mußt du evtl in einen anderen typ casten.
viel erfolg noch,
Matthias
-
Vielen Dank für deine Mühe Matthias!
Es hat jedoch trotzdem nicht funktioniertAllerdings bin ich jetzt superhappy, denn nach vielem herumschnüffeln und ausprobieren,hab ich jetzt endlich einen funktionierenden Weg gefunden,
und da ich im Internet nicht eine einzige Deutsche Dokumentation dazu gefunden habe werde ich dem geneigten Leser hier mal einen funktionierenden Lösungsweg aufzeigen:Schritt 1.
- Anfangen tuen wir damit der Listboxeigenschaft Allowdrop den Wert true zuzuweisen.lstPlaylist->AllowDrop = true;
Schritt 2.
- Definieren der Funktion zum behandeln des DragEnter-Ereignisses der Listbox.lstPlaylist->DragEnter += gcnew DragEventHandler( this, &Form1::Form1_DragEnter );
Schritt 3.
- Definieren der Funktion zum behandeln des DragDrop-Ereignisses der Listbox.DragDrop += gcnew DragEventHandler( this, &Form1::Form1_DragDrop );
Schritt 4.
- Die Funktion DragEnter der Listbox Implementieren.private: System::Void lstPlaylist_DragEnter(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) { if ( e->Data->GetDataPresent(DataFormats::FileDrop) ) { e->Effect = DragDropEffects::All; } }
Schritt 5. ( Der letzte Schritt - So schwer wars doch gar nicht )
- Die Funktion DragDrop der Listbox Implementieren.private: System::Void lstPlaylist_DragDrop_1(System::Object^ sender, System::Windows::Forms::DragEventArgs^ e) { // Filedrop Daten behandeln if ( e->Data->GetDataPresent( DataFormats::FileDrop ) ) { // Für den Fall, dass der Benutzer mehrere Dateien ausgewählt hat, // werden die Dateinamen einem String* Array zugewiesen. array<String^>^files = (array<String^>^)e->Data->GetData(DataFormats::FileDrop ); try { // Alle Indizes des Array durchlaufen und der Playlist // hinzufügen. for (int i = 0; i+1 <= files->GetLength(0); i++) { lstPlaylist->Items->Add(files[ i ]); } } catch ( Exception^ ex ) { MessageBox::Show( ex->Message ); return; } // Ende von try/catch } // Ende von If } // Ende von DragDrop
Ich hoffe diese Anleitung wird für den einen oder anderen verzweifelten eine Hilfe sein