2008-10-24 20 views
19

De todo lo que he leído, parecía que agregar paginación a un control ListView debería ser muy simple, pero no funciona para mí. Después de agregar los controles ListView y DataPager al formulario y conectarlos juntos, estoy obteniendo un comportamiento muy extraño. El DataPager limita correctamente el tamaño de página de ListView, pero hacer clic en los botones de búsqueda no afecta en absoluto a ListView. Los botones de búsqueda parecen pensar que están haciendo su trabajo, ya que el último botón está desactivado cuando va a la última página, etc., pero el ListView nunca cambia. Además, se necesitan dos clics en el DataPager para lograr que haga algo, es decir, al hacer clic en Última vez no se hace nada, pero al hacer clic una segunda vez, el DataPager reacciona como si la última página estuviera ahora seleccionada.ListView con DataPager no funciona

Lo único que se me ocurre es que estoy vinculando el DataSource en tiempo de ejecución (a un objeto LINQ), no usando un control LinqDataSource ni nada. ¿Alguien ha visto este comportamiento? ¿Estoy haciendo algo mal? Aquí está el código que estoy usando:

<asp:DataPager ID="HistoryDataPager" runat="server" PagedControlID="HistoryListView" PageSize="10"> 
    <Fields> 
     <asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="true" ShowLastPageButton="true" /> 
    </Fields> 
</asp:DataPager> 

<asp:ListView ID="HistoryListView" runat="server"> 
    ... 
</asp:ListView> 

En el código subyacente:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    If Not IsPostBack Then 
     HistoryListView.DataSource = From x in myContext.myTables ... 
     DataBind() 
    End If 

End Sub 

Respuesta

1

Tome un vistazo a la ListViewPagedDataSource.

private ListViewPagedDataSource GetProductsAsPagedDataSource(DataView dv) 
{ 
// Limit the results through a PagedDataSource 
ListViewPagedDataSource pagedData = new ListViewPagedDataSource(); 
pagedData.DataSource = dv; 
pagedData.MaximumRows = dv.Table.Rows.Count; 
pagedData.TotalRowCount = dpTop.PageSize; 

if (Request.QueryString[dpTop.QueryStringField] != null) 
    pagedData.StartRowIndex = (Convert.ToInt32(Request.QueryString[dpTop.QueryStringField]) - 1) * dpTop.PageSize; 
else 
    pagedData.StartRowIndex = 0; 

return pagedData; 
} 

Aunque, tengo un problema para ver la última página. El DataPager salta a la primera página, pero los datos que se muestran son la última página.

28

Necesitamos volver a ver la lista de datos en el evento OnPreRender.

protected override void OnPreRender(EventArgs e) 
     { 
      ListView1.DataBind(); 
      base.OnPreRender(e); 
     } 

--update

Después de trabajar en un par de vistas de lista con asp.net ajax, vi una solución que tiene más sentido que el de arriba. Normalmente, enlazaría datos de Listview en el método de carga de página o un controlador de eventos de clic de botón y, cuando haya una publicación posterior, el enlace de datos se perderá tal como se describió anteriormente en el problema. Por lo tanto, debemos volver a vincular los datos en el controlador de eventos modificado de propiedades de página para la vista de lista.

ListView_PagePropertiesChanged(object sender, EventArgs e) 
{ 
ListView.DataSource=someDatasource; 
ListView.DataBind() 
} 
+1

No es necesario que se databind * nuevo *. Pero sí, puedes solucionar este problema mediante la vinculación de datos en prerender. –

+1

Esto es lo más estúpido que he visto en ASP.net (aunque estoy seguro de que es peor). Pero gracias por encontrarlo. Nunca pensé que habría un error pre_render. – Dexter

+0

@Syam cuando uso la preimpresión omite la lista El origen de datos de la vista resulta ser nulo (al hacer clic en el botón siguiente) y luego no se muestra ningún registro ... ¿alguna suposición? – tariq

0

Además, si se cambia la fuente de datos de su ListView (por ejemplo, si la visualización de datos en base a los parámetros de búsqueda), no se olvide de restablecer el buscapersonas cada vez que se actualiza el origen de datos. Con un ListView esto no es tan sencillo como algunos otros controles enlazados a datos (por ejemplo GridView):

private void ResetListViewPager() 
{ 
    DataPager pager = (DataPager)ListViewMembers.FindControl("DataPager1"); 
    if (pager != null) 
    { 
     CommandEventArgs commandEventArgs = new CommandEventArgs(DataControlCommands.FirstPageCommandArgument, ""); 
     // MAKE SURE THE INDEX IN THE NEXT LINE CORRESPONDS TO THE CORRECT FIELD IN YOUR PAGER 
     NextPreviousPagerField nextPreviousPagerField = pager.Fields[0] as NextPreviousPagerField; 
     if (nextPreviousPagerField != null) 
     { 
      nextPreviousPagerField.HandleEvent(commandEventArgs); 
     } 

     // THIS COMMENTED-OUT SECTION IS HOW IT WOULD BE DONE IF USING A NUMERIC PAGER RATHER THAN A NEXT/PREVIOUS PAGER 
     //commandEventArgs = new CommandEventArgs("0", ""); 
     //NumericPagerField numericPagerField = pager.Fields[0] as NumericPagerField; 
     //if (numericPagerField != null) 
     //{ 
     // numericPagerField.HandleEvent(commandEventArgs); 
     //} 
    } 
} 
1

Enlazar el ListView en de pre DataPager rinden evento no en carga de la página. Por favor, vea la solution here

4

una solución más, es simple, acaba de obtener "ID" en "cadena de consulta" de la base de datos, establecen ahora a la propiedad Pager de control como [QueryStringField = "ID"] como:

<asp:DataPager ID="DataPagerProducts" runat="server" QueryStringField="ID" PageSize="3"> 
          <Fields> 
           <asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" /> 
           <asp:NumericPagerField /> 
           <asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" /> 
          </Fields> 
         </asp:DataPager> 

Nota: si no se woking, a continuación, establezca también [ PagedControlID="ListView_Name" ].

+0

Excelente !!!!!! ¡Esto solucionó mi problema donde todo lo demás había fallado! – James

+0

Esta respuesta no tiene ningún sentido. – MC9000

0
<asp:ListView ID="ListView1" runat="server" DataSourceID="sdsImages"> 
    <ItemTemplate> 
     <div class="photo sample12"> 
       <asp:Image ID="img_Galerie" runat="server" ImageUrl='<%# "~/imageHandler.ashx?ID=" + Eval("ImageID") %>' /> 
     </div> 
    </ItemTemplate> 
</asp:ListView> 
<asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1" PageSize="3" QueryStringField="ImageID"> 
    <Fields> 
     <asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" /> 
     <asp:NumericPagerField /> 
     <asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" /> 
    </Fields> 
</asp:DataPager> 
<asp:SqlDataSource ID="sdsImages" runat="server" 
    ConnectionString="<%$ ConnectionStrings:DBCS %>" 
    SelectCommand="SELECT ImageID FROM Images "> 

+0

¿Puede proporcionar una explicación? – CraigTeegarden

0

intente esto:

protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e) 
{ 
    DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false); 
    ListView1.DataSource = productList; 
    ListView1.DataBind(); 
    DataPager1.DataBind(); 
} 
Cuestiones relacionadas