2010-07-26 17 views
7

Ich versuche, eine C# Drag-and-Drop-Zeilenumordnung mit einer Listview zu implementieren, die dann eine SQL-Datenbank mit der aktuellen Reihenfolge der Zeilen aktualisieren würde. Ich habe einige Code-Schnipsel im Internet gefunden (eine von dieser Website, die eine 'var' Klasse implementiert hat), aber keine scheint mit meinen Bedürfnissen zu funktionieren. Ich benötige keine Hilfe beim Aktualisieren der Datenbank, da ich eine gute Idee habe, wie ich das machen würde, aber ich kann nicht scheinen, dass die Zeilenumordnung richtig funktioniert, jede Eingabe würde geschätzt werden.C# Listview Ziehen und Ablegen von Zeilen

-Danke

m & ein

Antwort

14
  1. Stellen Sie sicher, dass AllowDragDrop auf True festgelegt ist. zumindest diese drei Ereignisse

2-Handler implementieren für

 private void myList_ItemDrag(object sender, ItemDragEventArgs e) 
     { 
      DoDragDrop(e.Item, DragDropEffects.Link); 
     } 

     private void myList_DragEnter(object sender, DragEventArgs e) 
     { 
      e.Effect = DragDropEffects.Link; 
     } 

     private void myList_DragDrop(object sender, DragEventArgs e) 
     { 
      // do whatever you need to reorder the list. 
     } 

Erste den Index der Zeile, die Sie auf fiel etwas wie

Point cp = myList.PointToClient(new Point(e.X, e.Y)); 
ListViewItem dragToItem = myList.GetItemAt(cp.X, cp.Y); 
int dropIndex = dragToItem.Index; 
+3

+1 für das Zeilenfindungsbeispiel. –

+0

Danke, es sieht so aus, als ob die Methode myList_DragDrop etwas basteln würde. Also nach meinem Verständnis werden wir das ausgewählte Element aus der Liste entfernen und später wieder in den neuen Index hinzufügen (wo wir es löschen wollen?). Außerdem müssten wir die Reihe, in die wir fallen, um eins nach unten verschieben ... Gibt es ein Ereignis, das das angeht? – Mike

+0

Hallo, die ItemDrag-Methode übergibt das gesamte ListView-Steuerelement in die DragDrog-Methode, in der ich nicht den bestimmten Gegenstand greifen kann, den ich angefangen habe zu ziehen, irgendwelche Vorschläge? private void empList_ItemDrag (Objektabsender, ItemDragEventArgs e) {DoDragDrop (e.Item, DragDropEffects.Link); empList.Items.RemoveAt (empList.SelectedIndices [0]); } private void empList_DragDrop (Objekt Absender, DragEventArgs e) {Punkt cp = empList.PointToClient (neuer Punkt (e.X, e.Y)); ListViewItem dragToItem = empList.GetItemAt (cp.X, cp.Y); int dropIndex = dragToItem.Index; } – Mike

0

Ich weiß, dass dies nicht ListView spezifisch ist, aber ich habe Codebeispiel Reihe ziehen für die Implementierung und aus/in einem DataGridView fallen. Ein Teil davon ist offenbar spezifisch zu steuern, ist ein anderer Code tatsächlich ziemlich allgemein (wie die Entscheidung, wann es ein Drag):

http://adamhouldsworth.blogspot.com/2010/01/datagridview-multiple-row-drag-drop.html

vollständig die Tatsache vergessen, dass ListView bereits Drag-Drop erlaubt!

Ich kann auch etwas Theorie hinzufügen - wenn der Tropfen auf Ihrem Steuerelement auftritt, müssen Sie testen, auf diese Koordinaten (wahrscheinlich eine Methode namens HitTest) auf ListView, um zu sehen, welche Zeile getroffen wurde, das ist die Grundlage für wo die Zeile eingefügt werden soll

Unrelated - ist das var Klasse vielleicht das neue var Schlüsselwort in C#?

+0

Hallo Adam aussehen, Wir dachten, Listview erlaubt Drag Aber abgesehen von der Eigenschaft allowdrop = true, können wir keine automatische Logik finden, die die Reihen für uns bewegt. Aus diesem Grund sieht es so aus, als würde es mit Ereignissen (wie dem obigen Post) implementiert werden. Das Var-Attribut kam in Frage, als wir uns den folgenden Beitrag ansahen: http://StackOverflow.com/Questions/643275/c-drag-drop-in-listview – Mike

+0

@Mike Yea realisierte ich, als ich den anderen Beitrag entdeckte Deshalb habe ich den relevanten Teil meiner Antwort gestrichen. Was ich nicht erkannte, war, dass das ListView eine GetItemAt-Methode hat, die den Hit-Test für Sie einkapselt. Damit war alles, was man brauchte, um die Zeile zu entfernen und sie in den gegebenen Index 1 einzufügen. In diesem Post ist auch das neue Schlüsselwort var - es bedeutet nur, dass der Compiler den Typ für dich leitet - syntaktischer Zucker. –

+0

Hallo, die ItemDrag-Methode übergibt das gesamte ListView-Steuerelement in die DragDrog-Methode, in der ich nicht den bestimmten Gegenstand, den ich angefangen habe, ziehen, irgendwelche Vorschläge? private void empList_ItemDrag (Objekt Absender, ItemDragEventArgs e) { DoDragDrop (e.Item, DragDropEffects.Link); empList.Items.RemoveAt (empList.SelectedIndices [0]); } private void empList_DragDrop (object sender, DragEventArgs e) { Punkt cp = empList.PointToClient (new Point (e.X, E.Y)); ListViewItem dragToItem = empList.GetItemAt (cp.X, cp.Y); int dropIndex = dragToItem.Index; } – Mike

Verwandte Themen