2009-10-25 41 views
5

Bueno, algún tipo de pregunta n00b de mi parte. He navegado por la red y tengo preguntas similares aquí, pero no he encontrado ninguna respuesta correcta para un problema tan simple (como yo pensaba).Seleccione la fila después de actualizar DBGrid

Tengo un DBGrid. Selecciono una fila y realizo algunas acciones con otra información vinculada a esta fila. Después de terminar, mi DBGrid se actualiza y la fila seleccionada se restablece a la primera. Quiero que se seleccione la misma fila que se seleccionó antes de actualizar los datos de DBGrid. ¿Alguna sugerencia?

Respuesta

4

Antes de la actualización, guarde la selección actual del conjunto de datos vinculados como un marcador, luego restaure el marcador después.

+0

Yup, seem it works. ¡Gracias! – Vlad

+1

¿Podría darnos un código de muestra? – truthseeker

-1
RecKey:=DmFRM.ViewTBL.RecNo; 
      with DmFRM.ViewTBL do 
       begin 
        Active:=false; 
        Active:=True; 
        RecNo:=RecKey; 
       end; 
+0

Veo que esto ya tiene un -1, así que no agregaré el mío. La razón de -1 es probable que no todos los descendientes de TDataSet implementen RecNo de manera útil o, en algunos casos, en absoluto. Por lo tanto, no es útil como respuesta general a la pregunta de la Operación, me temo, – MartynA

+0

@MartynA: "GetBookmark se basa en un método protegido para obtener el valor de marcador. Los descendientes TDataSet implementan este método para proporcionar su propio tipo de soporte de marcador Los conjuntos de datos unidireccionales no admiten marcadores, por lo que no devuelven un valor significativo ". –

+0

@Mahmood_M: No estoy seguro de por qué me lo estás citando. Los conjuntos de datos unidireccionales pueden no admitir marcadores, pero es por la misma razón que no se pueden conectar directamente a un TDBGrid, es decir, que la cuadrícula depende de que el conjunto de datos sea navegable en ambas direcciones. Entonces, para usar un conjunto de datos unidireccional para TDBGrid, debe conectar la grilla a un TClientDataset y cargarlo desde el unidireccional. – MartynA

4

Esta respuesta está pensada como un complemento menor de Mason, no una alternativa. Lo he agregado solo porque ha aparecido otra respuesta, sugiriendo, incorrectamente, el uso de la propiedad RecNo del conjunto de datos. No todos los descendientes TDataSet implementan RecNo confiablemente o en absoluto. Algunos descendientes simplemente devuelven un valor constante, p. 0 para el RecNo de las filas actuales y no hacer nada cuando le asigne un valor.

procedure TMyForm.DoSomethingWithDataSet(ADataSet : TDataSet); 
var 
    Bookmark : TBookmark; 
begin 
    Bookmark := ADataSet.GetBookmark; // Save your place in ADataSet 

    try 
    Screen.Cursor := crSqlWait; // Show the user that something is happening 
    Update; // update the form to make sure screen cursor updates 
    ADataSet.DisableControls; 
    // do something with ADataSet here e.g. 
    ADataSet.First; 
    while not ADataSet.Eof do begin 
     // do something with current row here, then 
     ADataSet.Next; 
    end; 
    finally 
    ADataSet.GotoBookmark(Bookmark); // Return to where you were at outset 
    ADataSet.FreeBookmark(Bookmark); 
    ADataSet.EnableControls; 
    Screen.Cursor := crDefault; // Let the user see you're done 
    end; 
end; 
+0

Boomark funciona como RecNo? o no ? , por ejemplo: si obtengo el marcador, entonces borro algunos registros antes del registro seleccionado y luego voy a marcar, ¿ahora el registro seleccionado es el mismo que el seleccionado antes de eliminar? , en otras palabras: Marcador almacenar solo RecNo o Posición de registro o almacena otra información sobre el registro seleccionado? –

+0

Creo que depende de cómo se implementen los marcadores en el particular descendanf o TDataset, pero me sorprendería que los comunes usen simplemente un número de registro. De los pocos que he investigado, generalmente usan un buffer que contiene datos específicos de la implementación. Si tiene dudas sobre si un tipo determinado de conjunto de datos implementa marcadores, llame a la función BookmarkValid (vea OLH). – MartynA

+0

gracias, probé GetBookmark y GotoBookmark por un registro eliminado: GetBookmark -> Eliminar registro seleccionado (marcado como favorito) -> GotoBookmark, y recibí un error: "Registro no encontrado", tengo una tabla que debe actualizarse cada segundo y quiero para mantener a los usuarios desplazándose, en esta situación creo que debería usar RecNo, probé RecNo y funciona bien –

Cuestiones relacionadas