Como expliqué en un post anterior es posible utilizar un DataPager
con un ListView
de la siguiente manera:
- <asp:ListView ID="LVRegistros" runat="server" DataKeyNames="IdRegistro"
- ItemPlaceholderID="AquiVanLosItems">
- <LayoutTemplate>
- <table width="100%" border="0" cellpadding="5" cellspacing="0">
- <tr>
- <td class="tdDatosTitulo">Nombre
- </td>
- </tr>
- <asp:PlaceHolder ID="AquiVanLosItems" runat="server"></asp:PlaceHolder>
- <tr>
- <td colspan="7" class="TdPie">Páginas:
- <asp:DataPager ID="Pager1" runat="server" PageSize="30">
- <Fields>
- <asp:NumericPagerField ButtonCount="50" />
- </Fields>
- </asp:DataPager>
- </td>
- </tr>
- </table>
- </LayoutTemplate>
- <ItemTemplate>
- <tr>
- <td>
- <%#Eval("IdCarpeta")%>
- </td>
- </tr>
- </ItemTemplate>
- <EmptyDataTemplate>
- No existen registros.
- </EmptyDataTemplate>
- </asp:ListView>
Ahora bien, si haces el Bind
con un ObjectDataSource
o algún control similar en el archivo .aspx
, todo funciona perfectamente.
Sin embargo, si estás haciendo el DataBind
en el código de servidor (code-behind
), entonces te darás cuenta de que al hacer clic en la página número 2 (por ejemplo) del paginador, no ocurre nada, se sigue mostrando la primera página.
Esto es debido a que estás llenando el ListView
en el código de servidor.
Para solucionarlo, debes colocar el siguiente procedimiento en tu archivo .aspx.vb
:
- Protected Sub LVRegistros_PagePropertiesChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.PagePropertiesChangingEventArgs) Handles LVRegistros.PagePropertiesChanging
- Pager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, False)
- LVReflexiones.DataBind()
- End Sub
Ahora pruébalo y verás como todo funciona como debe.
Sr.Pablo, despues de ver su solución al paginado de un listview cuando se hace el bind a nivel de servidor, copie la misma solucion adaptandola a mi necesidad y resulto que en fase de diseño no me reconoce el control “Pager1”, cuando lo escribo en el evento “PagePropertiesChanging”, me lo subraya como si no estuviera agregado en la página aspx.
Si me puede ayudar, desde ya gracias.
Hola Eduardo, intenta colocar el DataPager1 fuera del listview, para que te lo reconozca.
Excelente!!! Al fin pude hacer funcionar bien el datapager (después de semanas), pero tuve que agregarle el datasource de nuevo al listview quedando así:
Una pregunta si puedes responderla: ¿Al hacer el datasource cada vez que cambia no estoy trayendo “todos” los datos cada vez? cierto? Si fuera así no sería óptimo si no me equivoco, ¿quizás se pueda hacer la consulta sql con un LIMIT? Tengo alguna idea de como lo haría, pero ¿cómo lo harías tú? Me atrevo a preguntar porque noté que tu página y tus publicaciones son muy buenas (felicidades).
Bueno, espero no sea mucho, desde ya gracias por la información, ha sido de gran ayuda.
saludos
Hola Oscar, diste en el clavo. No es completamente eficiente porque siempre vuelves a traer todos los registros. En proyectos pequeños y medianos no hay problema, pero si hablamos de cientos de miles de registros, entonces deberías optar por otra solución.
Mira esta liga:
http://www.4guysfromrolla.com/webtech/041206-1.shtml
Muchas gracias Pablo, me sirvió mucho la liga que me diste y mejor todavía que ahí lo explican con SP, ya que quiero empezar a migrar varias de mis conexiones sql a SP. Sólo no entiendo por qué no realizan un LIMIT en vez de hacer una tabla temporal, ¿antes no se ocupaba esa cláusula? Bueno, de todos modos me abriste los ojos, ahora solo me queda probar y probar.
Muchas gracias por todo y por la pronta respuesta.
Saludos
Creo que con LIMIT te refieres a la instrucción de MySQL. Lo más parecido que existe en SQL Server es TOP, pero solamente puede devolverte los primeros n registros. No le puedes decir que te regrese del 50 al 60 por ejemplo. Parece algo muy básico y sorprende que no lo hayan desarrollado así.
De cualquier forma puedes hacer lo que intentas usando row_number.
Ejemplo:
Ejemplo tomado de:
http://msdn.microsoft.com/es-es/library/ms186734.aspx
Saludos.
Ahh perfecto, no sabía que esa instrucción era sólo de MySQL. Es que yo trabajo ASP.NET con MySQL. Menos mal que no lo hago con SQLServer sino no tendría esa instrucción aunque la solución que expones se ve bastante buena pero más complicada que el LIMIT.
Saludos
Si que necesita un refresh
Gracias por la información.