Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   .NET (https://www.clubdelphi.com/foros/forumdisplay.php?f=17)
-   -   Paginación datagrid (https://www.clubdelphi.com/foros/showthread.php?t=48072)

Mariolarr 14-09-2007 15:57:45

Paginación datagrid
 
Hola de nuevo, jeje la verdad es que el foro me está cundiendo :p.
Ahí va la pregunta: Tengo un datagrid paginado, muestra correctamente el contenido pero cuando selecciono otra página me muestra la tabla sin contenido y en el pie está seleccionada el número de página que había pulsado. En el evento PageIndexChanged tengo el siguiente código:
Código Delphi [-]
  
DataGrid1.CurrentPageIndex := e.NewPageIndex;
DataGrid1.DataSource:=CatalogoReader;
DataGrid1.DataBind;

Y la carga inicial del datagrid se hace mediante el siguiente código, donde la variable CatalogoReader : BdpDataReader; está declarada de forma global:

Código Delphi [-]
var
  Trans : BdpTransaction;
  Cadena: BdpCommand;
  sSQL: string;
  //CatalogoReader : BdpDataReader;
  i: integer;
begin

  Trans := MyConeccion.BeginTransaction();
Art_Codi = ''1000VIT''';
  sSQL := 'select Art_Codi, Art_Desc, Art_EPV_Coste from Articulos where Art_PVP1 = ''' + '0' + '''';
  Cadena := BdpCommand.Create(sSQL, MyConeccion, Trans);
  CatalogoReader := Cadena.ExecuteReader;


  DataGrid1.VirtualItemCount := 15000;
  DataGrid1.DataSource:=CatalogoReader;
  DataGrid1.DataBind;


  Trans.Commit;
  Trans.Free;

Espero vuestras respuestas porque realmente llevo tiempo con esto.
Gracias anticipadas :o

__hector 14-09-2007 17:50:28

El codigo que llena la variable se ejecuta cada vez que cargas la pagina? Lo tienes en el page_load ?

Me parece que en el segundo bind, el datasource no tiene datos.

Mariolarr 17-09-2007 09:05:12

Si lo pongo en el load ma carga los 10 primeros elementos de nuevo y si no le indico que solo se me cargue una vez es cuando me la deja en blanco.

__hector 17-09-2007 19:50:44

Tienes que colocar el codigo que llena el datasource en un método aparte, y en el evento pageindexchanged en el que le estas asignando el nuevo numero de pagina, deberás llamar el metodo que llena el datasource antes de hacer databind, pues cada vez que hagas un databind el datasource debe tener datos, siempre.

Como es una ejecución desconectada, entre cada llamada el datasource no mantiene los registros, salvo que lo metas en alguna variable de sesión, aplicacion, cache o en el viewstate de la pagina, y según explicas tu caso, no creo que sea necesario hacer nada de eso.

Suerte!

Mariolarr 18-09-2007 08:38:26

Muchas gracias por tu atención, aqui te muestro el contenido del codigo con las modificaciones que me has dicho:
Procedimiento PageIndexChange
Código Delphi [-]
  CambiarPaginaAux;

  DataGrid1.CurrentPageIndex :=e.NewPageIndex;
  DataGrid1.DataBind;

  CatalogoReader.Close;
  Trans.Commit;
  Trans.Free;

Procedimiento CambiarPaginaAux, donde las variables Trans y CatalogoReader son globales.
Código Delphi [-]
var
  Cadena: BdpCommand;
  sSQL: string;
begin
  Trans := MyConeccion.BeginTransaction();

  sSQL := 'select Art_Codi, Art_Desc, Art_EPV_Coste from Articulos where Art_PVP1 = ''' + '0' + '''';
  Cadena := BdpCommand.Create(sSQL, MyConeccion, Trans);
  CatalogoReader := Cadena.ExecuteReader;

  DataGrid1.VirtualItemCount := 15000;
  DataGrid1.DataSource:=CatalogoReader;
Haciendo esto, me señala el número de la página pulsada como si estuviera situado en él, pero el contenido es el de la página 1.

Gracias :o

__hector 18-09-2007 16:18:32

- Pon el databind como parte del metodo CambiarPaginaAux
- cambia el orden de ejecucion, colocando la llamada al metodo justo despues de cambiar el indice de la pagina
- verifica que los registros entre paginas deben ser diferentes en la tabla

Código:

  DataGrid1.CurrentPageIndex :=e.NewPageIndex;
  CambiarPaginaAux;

  // estas lineas no deberian ser parte de este metodo
  CatalogoReader.Close;
  Trans.Commit;
  Trans.Free;
 // fin comentario


Mariolarr 18-09-2007 16:33:34

Hola de nuevo, he hecho las modificaciones que me has dicho pero me sigue ocurriendo lo mismo, mira:

Código Delphi [-]
procedure TWebForm2.CambiarPaginaAux;
var
  Cadena: BdpCommand;
  sSQL: string;
begin
  Trans := MyConeccion.BeginTransaction();

  sSQL := 'select Art_Codi, Art_Desc, Art_PVP1 from Articulos_Web'; 
  Cadena := BdpCommand.Create(sSQL, MyConeccion, Trans);
  CatalogoReader := Cadena.ExecuteReader;

  DataGrid1.VirtualItemCount := 15000;
  DataGrid1.DataSource:=CatalogoReader;
  DataGrid1.DataBind;

  CatalogoReader.Close;
  Trans.Commit;
  Trans.Free;
end;


Y el de Cambio de pagina

Código Delphi [-]
 DataGrid1.CurrentPageIndex :=e.NewPageIndex;
 CambiarPaginaAux;

Las dos variables las sigo teniendo como globales :confused:


La franja horaria es GMT +2. Ahora son las 07:50:00.

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