2010-07-26 23 views
7

Estoy intentando implementar un arrastre de C# y soltar el reordenamiento de filas con una vista de lista que luego actualizaría una base de datos SQL con el orden actual de las filas. Me he encontrado con algunos fragmentos de código en Internet (uno de este sitio web que implementó una clase 'var') pero ninguno parece estar funcionando con mis necesidades. No necesito ayuda para actualizar la base de datos ya que tengo una buena idea de cómo haría esto, pero parece que no puedo hacer que el reordenamiento de fila funcione correctamente, cualquier comentario sería apreciado.C# Listview Arrastrar y colocar filas

-gracias

m & un

Respuesta

14
  1. Asegúrese de que AllowDragDrop esté establecido en verdadero.

2 implementar controladores de por lo menos estos 3 eventos

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

Conseguir el índice de la fila que se dejó caer puede ser algo como

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

+1 para la muestra de búsqueda de fila. –

+0

Gracias, parece que el método myList_DragDrop requerirá algunos retoques. Por lo tanto, a mi entender, tendremos que eliminar el elemento seleccionado de la lista y luego volver a agregarlo al nuevo índice (¿dónde queremos soltarlo?). Además, también tendríamos que desplazarnos por la fila en la que caemos por uno ... ¿hay algún evento que maneje esto? – Mike

+0

Hola, el método ItemDrag pasa todo el control ListView al método DragDrog, en el que no puedo tomar el elemento específico que he comenzado a arrastrar, ¿alguna sugerencia? private void empList_ItemDrag (object remitente, ItemDragEventArgs e) {DoDragDrop (e.Item, DragDropEffects.Link); empList.Items.RemoveAt (empList.SelectedIndices [0]); } private void empList_DragDrop (object remitente, 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

Sé que esto no es ListView específica, pero tengo código de ejemplo para la implementación de la fila de arrastrar y soltar de/en un DataGridView. Parte de ella es, obviamente, un control específico, otro código es en realidad bastante genérico (como por ejemplo decidir cuando es un arrastre):

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

olvidó por completo el hecho de que ya ListView permite arrastrar caída!

También puedo agregar algo de teoría: cuando ocurra una caída en su control, tendrá que pulsar la prueba en esas coordenadas (probablemente un método llamado HitTest) en el ListView para ver qué fila se golpeó, esta es la base para dónde insertar la fila que se está arrastrando

No relacionado - ¿es esa la clase var quizás la nueva palabra clave var en C#?

+0

Hola Adam, Pensamos ListView permite arrastrar -dropping, sin embargo, además de la propiedad allowdrop = true, no podemos encontrar ninguna lógica automática que mueva las filas por nosotros. Por eso parece que implementarlo con eventos (como la publicación anterior) es lo que se requiere. El atributo var se puso en duda cuando miramos la siguiente publicación: http://stackoverflow.com/questions/643275/c-drag-drop-in-listview – Mike

+0

@Mike Sí, me di cuenta cuando vi la otra publicación , por lo tanto, taché la parte relevante de mi respuesta. Lo que no me di cuenta fue que el ListView tiene un método GetItemAt, que encapsula muy bien la prueba de impacto. Al usar eso, todo lo que se necesitaba era eliminar la fila e insertarla en el índice dado - 1. Además, en esa publicación está la nueva palabra clave var - solo significa que el compilador deduce el tipo para usted - azúcar sintáctica. –

+0

Hola, el método ItemDrag pasa todo el control ListView al método DragDrog, en el que no puedo tomar el elemento específico que he comenzado a arrastrar, ¿alguna sugerencia? void privado empList_ItemDrag (remitente del objeto, ItemDragEventArgs e) { DoDragDrop (e.Item, DragDropEffects.Link); empList.Items.RemoveAt (empList.SelectedIndices [0]); } vacío privado empList_DragDrop (remitente del objeto, DragEventArgs e) { Punto cp = empList.PointToClient (nuevo punto (e.X, e.Y)); ListViewItem dragToItem = empList.GetItemAt (cp.X, cp.Y); int dropIndex = dragToItem.Index; } – Mike

Cuestiones relacionadas