Como expliqué en un post anterior es posible utilizar un DataPager con un ListView de la siguiente manera:

  1. <asp:ListView ID="LVRegistros" runat="server" DataKeyNames="IdRegistro"
  2.    ItemPlaceholderID="AquiVanLosItems">
  3.     <LayoutTemplate>
  4.         <table width="100%" border="0" cellpadding="5" cellspacing="0">
  5.             <tr>
  6.                 <td class="tdDatosTitulo">Nombre
  7.                 </td>
  8.             </tr>
  9.             <asp:PlaceHolder ID="AquiVanLosItems" runat="server"></asp:PlaceHolder>
  10.             <tr>
  11.                 <td colspan="7" class="TdPie">Páginas:
  12.             <asp:DataPager ID="Pager1" runat="server" PageSize="30">
  13.                 <Fields>
  14.                     <asp:NumericPagerField ButtonCount="50" />
  15.                 </Fields>
  16.             </asp:DataPager>
  17.                 </td>
  18.             </tr>
  19.         </table>
  20.     </LayoutTemplate>
  21.     <ItemTemplate>
  22.         <tr>
  23.             <td>
  24.                 <%#Eval("IdCarpeta")%>
  25.             </td>
  26.         </tr>
  27.     </ItemTemplate>
  28.     <EmptyDataTemplate>
  29.         No existen registros.
  30.     </EmptyDataTemplate>
  31. </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:

  1. Protected Sub LVRegistros_PagePropertiesChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.PagePropertiesChangingEventArgs) Handles LVRegistros.PagePropertiesChanging
  2.      Pager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, False)
  3.      LVReflexiones.DataBind()
  4. End Sub

Ahora pruébalo y verás como todo funciona como debe.

8 comentarios sobre “Utilizar un DataPager haciendo el DataBind en Code-Behind

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

  2. 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í:

    Protected Sub LVRegistros_PagePropertiesChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.PagePropertiesChangingEventArgs) Handles LVRegistros.PagePropertiesChanging
       LVReflexiones.DataSource = Consultar.Historial(.....)
       Pager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, False)
       LVReflexiones.DataBind()
     End Sub
    

    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

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

  4. 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:

    USE AdventureWorks2008R2;
    GO
    WITH OrderedOrders AS
    (
        SELECT SalesOrderID, OrderDate,
        ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
        FROM Sales.SalesOrderHeader 
    ) 
    SELECT * 
    FROM OrderedOrders 
    WHERE RowNumber BETWEEN 50 AND 60;
    

    Ejemplo tomado de:
    http://msdn.microsoft.com/es-es/library/ms186734.aspx

    Saludos.

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


− siete = 2