Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   arrastrar y soltar fila de dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=68907)

nikotina 14-07-2010 13:42:03

arrastrar y soltar fila de dbgrid
 
Buenas a todos.Existe la posibilidad en D7 de seleccionar una fila determinada de un DBGrid, arrastrarla y soltarla en otra posicion del mismo?(como los iconos del escritorio).Por ejemplo, arrastrar la fila 5 y soltarla en la fila 3.Espero haber podido explicarme bien. UN abrazo a todos y gracias

Neftali [Germán.Estévez] 14-07-2010 16:14:43

El DBGrid tiene la posibilidad, como el resto de comtroles de programar los Drag&Drop (revisa los eventos).

Lo que ya no se si tiene mucho sentido es, arrastrar desde el DBGrid al propio DBGrid; Sí entre el DBGrid y otro control (puedes ver una explicación completa aquí).

Piensa que un DBGrid no es más que una visualización de registros, que vienen de un DataSet; El orden en que se muestran no es importante, al menos para el DBGrid, ya que viene dado por la ordenación del Dataset; De ahí que no acabo de ver claro lo que quieres hacer.

Si aun así lo intentas, utilizando los eventos de Drag deberías poder consegirlo. Revisa el artículo que te he puesto más arriba.

nikotina 14-07-2010 16:56:13

arrastrar y soltar fila de dbgrid
 
hOLA Neftali.Desde ya gracias por tu aporte y por tu tiempo.Tal vez lo enfoque desde otro lado. Lo que quiero es que el usuario pueda cambiar el orden de las filas de una manera sencilla.Desde ya muchas gracias nuevamente.

Neftali [Germán.Estévez] 14-07-2010 17:08:34

¿Ese DBGrid de dónde viene? ¿Una tabla? ¿Una consulta? ¿Con qué orden se está mostrando? ¿Tiene algun campo de tipo índice que marca el orden?

El problema es que cambiar el orden en un DBGrid significa cambiar el orden en la tabla/consulta asociada. ¿Eso lo tienes claro?
Como el DBGrid muestra lo que hay en la tabla, si quieres cambiar de orden los elementos, debes cambiarlos en la tabla, para que el Grid los muestre como quieres.

Por lo tanto, eso quiere decir que tus registros se están trayendo de la Base de Datos con un orden establecido. Al mover en el DBGrid lo que hay que hacer es hacer UPDATE en la tabla, para que el DBGrid te los muestre como quieres. ¿Lo entiendes?

Otra opción sería realizar las operaciones en memoria (TClientDataset) y luego volcarlas a tabla.

¿Puedes responder a las preguntas que te he puesto al principio, para saber qué es lo que quieres hacer y cómo lo quieres hacer?

nikotina 14-07-2010 18:24:37

arrastrar y soltar fila de dbgrid
 
Viene de un query y ordenado por un campo indice llamado 'orden'.
El DBGrid muestra los ejercicios de la rutina de un dia de gimnasio, ordenadas cronologicamente. Mi idea era que el usuario pueda cambiar el orden de los ejercicios de esa rutina al principio, final, o al medio segun quiera, con solo arrastrar el ejercicio a la posicion deseada.

coso 14-07-2010 22:14:48

Hola,
tal como te dice Neftalí, deberias usar los eventos drag&drop. En el momento del drop, lo unico que deberas hacer es editar y intercambiar el campo en el cual esta ordenado ese momento. Para saber los valores de la celda en la cual estas en el momento de soltar, puedes usar lo que se comento en este hilo. A ver si te sirve, saludos.

Neftali [Germán.Estévez] 15-07-2010 10:42:52

Cita:

Empezado por nikotina (Mensaje 370371)
Viene de un query y ordenado por un campo indice llamado 'orden'.
El DBGrid muestra los ejercicios de la rutina de un dia de gimnasio, ordenadas cronologicamente. Mi idea era que el usuario pueda cambiar el orden de los ejercicios de esa rutina al principio, final, o al medio segun quiera, con solo arrastrar el ejercicio a la posicion deseada.

Ok, en ese caso sí tiene sentido (como no explicaste más, no sabía si realmente sabías lo que estabas haciendo :D:D).
Se trataría de detectar la nueva posición y actualizar el campo ORDEN en la Base de Datos.

En este caso yo optaríapor utilizar un TStringGrid para las operaciones. Cargar los datos desde la base de datos y al hacer el Drag sobre el StringGrid actualizar los cambios.
Simplemente porque creo que con los eventos del StringGrid te será más fácil comtrolar las operaciones (siendo tanto el Drag como el Drop sobre el mismo Grid).

De todas formas, el código es casi igual si lo haces sobre un StringGrid que sobre un DBGrid, así que puedes hacer las pruebas sobre el DBGrid y si no te acaba de funcionar, pasar ese código a un StringGrid o viceversa.

nikotina 15-07-2010 13:10:41

arrastrar y soltar fila de dbgrid
 
Esa era mi idea. Programé un procedimiento que reordena los ejercicios. El tema es que no se como capturar el numero de fila en el momento del drop y guardarlo en una variable para pasarlo al procedimiento y reordenar.Es decir, tengo la fila 'origen' pero no se como captar la fila 'destino'.

Neftali [Germán.Estévez] 15-07-2010 13:35:05

Cita:

Empezado por nikotina (Mensaje 370465)
Esa era mi idea. Programé un procedimiento que reordena los ejercicios. El tema es que no se como capturar el numero de fila en el momento del drop y guardarlo en una variable para pasarlo al procedimiento y reordenar.Es decir, tengo la fila 'origen' pero no se como captar la fila 'destino'.

Ese es justo el problema que creo que te vas a encontrar en el DBGrid. En todo caso, más que intentar saber la fila donde lo dejas, creo que tal vez deberías capturar "el dato sobre el que lo dejas"; De ahí podrías sacar el uevo índice y realizar la actualización.

nikotina 15-07-2010 14:18:43

arrastrar y soltar fila de dbgrid
 
Justamente, el numero de fila es igual al valor del campo orden:FILA | orden | ejercicio 1 | 1 | AAAA 2 | 2 | BBBB 3 | 3 | CCCC ... | ...... | ........ ... | ...... | ........en el evento OnMouseMove de DBGrid le asigno a DBGrid1.Hint el nro. de fila en el cual estoy posicionado con el cursor, pero cuando suelto la fila origen en la fila destino el hint queda con el numero de fila origen.Esa era mi idea para captar el numero de fila destino, asignandole a una varible 'fila_destino' := StrToInt(DBGrid1.Hint);y pasarselo a ReordenarFilas(fila_origen, fila_destino);

nikotina 15-07-2010 14:28:36

arrastrar y soltar fila de dbgrid
 
Huyy!!!Disculpame por no dibujar correctamente la tabla.FILA ORDEN EJERCICIO 1 1 aaa 2 2 bbb 3 3 ccc 4 4 ddd

Neftali [Germán.Estévez] 15-07-2010 14:40:11

No te preocupes, creo que el formato de los mensajes que los descuadra.

Neftali [Germán.Estévez] 15-07-2010 14:45:18

1 Archivos Adjunto(s)
Te paso un pequeño ejemplo donde he hecho un par de pruebas con un StringGrid (lo teniá de otros temas -borrar líneas-, a esa parte no le hagas caso).

El código tal vez puedas adaptarlo al DBGrid. Tal vez no, por el tema que te he comentado de acceder al número de fila.

nikotina 15-07-2010 14:50:58

arrastrar y soltar fila de dbgrid
 
Neftali, no he podido extraer el archivo. Me da error o archivo roto

Neftali [Germán.Estévez] 15-07-2010 16:04:12

2 Archivos Adjunto(s)
Prueba con estos; Al RAR le quitas la extensión ZIP y lo dejas como RAR.

Me pasa a veces cuando subo adjuntos a los foros. :(


La franja horaria es GMT +2. Ahora son las 06:15:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi