2008-10-24 9 views
19

Von allem, was ich gelesen habe, schien es, dass das Hinzufügen von Paging zu einem ListView-Steuerelement tot einfach sein sollte, aber es funktioniert nicht für mich. Nachdem ich die ListView- und DataPager-Steuerelemente dem Formular hinzugefügt und sie miteinander verbunden habe, bekomme ich ein sehr merkwürdiges Verhalten. Der DataPager begrenzt die Seitengröße der ListView korrekt, aber das Klicken auf die Paging-Schaltflächen wirkt sich nicht auf die ListView aus. Die Paging-Schaltflächen scheinen zu glauben, dass sie ihren Job machen, da die letzte Schaltfläche deaktiviert ist, wenn Sie zur letzten Seite usw. gehen, aber das ListView ändert sich nie. Außerdem dauert es zwei Klicks auf den DataPager, um irgendetwas zu tun, d. H., Einmal auf Last zu klicken, tut nichts, aber ein zweites Mal bewirkt, dass der DataPager so reagiert, als wäre die letzte Seite jetzt ausgewählt.ListView mit DataPager funktioniert nicht

Das einzige, was mir einfällt, ist, dass ich die DataSource zur Laufzeit binden (an ein LINQ-Objekt), nicht mit einem LinqDataSource-Steuerelement oder irgendetwas. Hat jemand dieses Verhalten gesehen? Mache ich etwas falsch? Hier ist der Code Ich verwende:

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

Im Code-behind:

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 

Antwort

1

Werfen Sie einen Blick auf die 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; 
} 

Obwohl, ich habe ein Problem beim Anzeigen der letzten Seite. Der DataPager springt zurück zur ersten Seite, aber die angezeigten Daten sind die letzte Seite.

28

Wir müssen die Listenansicht erneut im OnPreRender-Ereignis aktualisieren.

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

--update

Nach der Arbeit auf ein paar Listenansichten mit asp.net Ajax, sah ich eine Lösung, die mehr Sinn als die oben macht man. Normalerweise würden Sie die ListView-Methode beim Laden der Seite oder eine Ereignisprozedur für den Button-Klick binden, und bei einem Postback würde die Datenbindung verloren gehen, wie oben im Problem beschrieben. Also, wir müssen Daten erneut auf Seiteneigenschaften geändert Event-Handler für die Listenansicht binden.

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

Sie brauchen nicht, es zu Databind * wieder *. Aber ja, Sie können dieses Problem durch Datenbindung im Prerender beheben. –

+1

Das ist die blödeste Sache, die ich jemals von ASP.net gesehen habe (obwohl ich sicher bin, dass es schlimmer ist). Aber danke, dass du es gefunden hast. Ich hätte nie gedacht, dass es einen pre_render Bug geben würde. – Dexter

+0

@Syam Wenn ich die Vor-Render-Überschreibung verwenden überschreibt die ListView-Datenquelle Null (beim Klicken auf nächste Schaltfläche) und dann wird kein Datensatz angezeigt ... irgendwelche Vermutungen? – tariq

0

Auch wenn die Datenquelle des Listview geändert wird (zum Beispiel, wenn die Daten anhand der Suchparameter angezeigt werden), nicht vergessen der Pager die Datenquelle aktualisiert wird jedes Mal zurückgesetzt werden. Mit einem Listview ist dies nicht so einfach, wie einige andere datengebundene Steuerelemente (z 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

Binden Sie die Listenansicht an Datapager-Veranstaltung vorge machen nicht an Seite zu laden. Bitte beachten Sie die solution here

4

One More Lösung, seine einfache, Holen Sie einfach "ID" in "QUERY-STRING" aus der Datenbank, jetzt stellen Sie den Pager Control Eigenschaft als [QueryStringField = "ID"] wie:

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

Hinweis: wenn nicht woking, setzen dann auch [ PagedControlID="ListView_Name" ].

+0

Hervorragend !!!!!! Das behebt mein Problem wo alles andere fehlgeschlagen ist! – James

+0

Diese Antwort ergibt überhaupt keinen Sinn. – 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

Können Sie eine Erklärung geben? – CraigTeegarden

0

versuchen Sie dies:

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