2010-07-26 18 views
7

Sto cercando di implementare un C# trascinare e rilasciare il riordino delle righe con un listview che aggiornerebbe quindi un database SQL con l'ordine corrente delle righe. Ho trovato alcuni frammenti di codice su Internet (uno da questo sito web che ha implementato una classe 'var') ma nessuno sembra funzionare con i miei bisogni. Non ho bisogno di aiuto per aggiornare il database poiché ho una buona idea di come lo farei, ma non riesco a ottenere il riordino delle righe per funzionare correttamente, qualsiasi input sarebbe apprezzato.C# Listview Trascina e rilascia le righe

-grazie

m & un

risposta

14
  1. Verificare che AllowDragDrop sia impostato su true.

2 implementare i gestori per almeno questi 3 eventi

 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. 
     } 

Ottenere l'indice della riga che si lasciò cadere sul potrebbe essere simile a

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

+1 per il campione di ricerca riga. –

+0

Grazie, sembra che il metodo myList_DragDrop richieda qualche ritocco. Quindi, per quanto ne so, dovremo rimuovere l'elemento selezionato dall'elenco e successivamente aggiungerlo nuovamente al nuovo indice (dove vogliamo farlo cadere?). Inoltre, dovremmo anche spostare la riga verso la quale ci spostiamo di uno ... c'è un evento che gestisce questo? – Mike

+0

Salve, il metodo ItemDrag passa all'intero controllo ListView nel metodo DragDrog, in cui non riesco ad afferrare l'elemento specifico che ho iniziato a trascinare, qualche suggerimento? private void empList_ItemDrag (oggetto mittente, ItemDragEventArgs e) {DoDragDrop (e.Item, DragDropEffects.Link); empList.Items.RemoveAt (empList.SelectedIndices [0]); } private void empList_DragDrop (object mittente, DragEventArgs e) {Point cp = empList.PointToClient (new Point (e.X, e.Y)); ListViewItem dragToItem = empList.GetItemAt (cp.X, cp.Y); int dropIndex = dragToItem.Index; } – Mike

0

So che questo non è ListView specifico, ma avere il codice di esempio per implementare fila trascinamento su/in un DataGridView. Una parte di esso è, ovviamente, di controllo specifici, altro codice è in realtà piuttosto generica (come decidere quando è un trascinamento):

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

Completamente dimenticato il fatto che ListView permette già drag-drop!

Posso anche aggiungere qualche teoria - quando si verifica la caduta sul vostro controllo, è necessario colpire prova su queste coordinate (probabilmente un metodo chiamato HitTest) sulla ListView per vedere cosa fila è stato colpito, questa è la base per dove inserire la riga trascinata.

Non correlato - è la classe var forse la nuova parola chiave var in C#?

+0

Ciao Adam, Abbiamo pensato ListView consente il drag Tuttavia, oltre alla proprietà allowdrop = true, non riusciamo a trovare alcuna logica automagic che sposta le righe intorno a noi. Ecco perché sembra come implementarlo con eventi (come il post precedente) è ciò che è richiesto. L'attributo var è stato messo in discussione quando abbiamo esaminato il seguente post: http://stackoverflow.com/questions/643275/c-drag-drop-in-listview – Mike

+0

@Mike yea ho capito quando ho individuato l'altro post , quindi ho eliminato la parte rilevante della mia risposta. Quello di cui non mi rendevo conto era che ListView ha un metodo GetItemAt - che incapsula il hit test per te. Usando questo, tutto ciò che era necessario era rimuovere la riga e inserirla nell'indice dato - 1. Inoltre, in quel post c'è la nuova parola chiave var - significa solo che il compilatore deduce il tipo per te - lo zucchero sintattico. –

+0

Salve, il metodo ItemDrag passa all'intero controllo ListView nel metodo DragDrog, nel quale non sono in grado di afferrare l'elemento specifico che ho iniziato a trascinare, qualche suggerimento? vuoto privato empList_ItemDrag (oggetto mittente, ItemDragEventArgs e) { DoDragDrop (e.Item, DragDropEffects.Link); empList.Items.RemoveAt (empList.SelectedIndices [0]); } private void empList_DragDrop (object sender, DragEventArgs e) { Point cp = empList.PointToClient (new Point (e.X, e.Y)); ListViewItem dragToItem = empList.GetItemAt (cp.X, cp.Y); int dropIndex = dragToItem.Index; } – Mike

Problemi correlati