Ich habe ein Problem mit dem GridView-Pager in der ASP.NET 4.5- und 4.5.1-Version entdeckt. Seit .NET 2 - 4 habe ich noch nie ein solches Problem erlebt.
Auf den Punkt, ich habe eine Gridview, die ich mit Daten in Code hinter so bevölkern:
%Vor%Das Problem ist, dass mein PageIndexChanging nicht ausgelöst wird, wenn ich die letzte Seite von GridView drücke und versuche, zu einer anderen Seite zurückzukehren. Das Problem tritt nur auf, wenn die letzte Seite nicht dieselbe Anzahl von Datensätzen wie PageSize hat. Das Verhalten ist, dass meine Seite neu geladen wird, die Seite der Gridview ist mit leeren Datenzeilen bis zur PageSize gefüllt. Das VirtualItemCount stellt korrekt Gesamt ItemCount dar.
Markup, wenn Sie dort etwas finden:
%Vor%Vielen Dank, ich beschäftige mich seit Tagen damit. Natürlich könnte ich den QueryString-Ansatz verwenden, aber da ich viele Tabellen verwenden werde, möchte ich, wenn möglich, beim Postback-Ansatz bleiben ...
BEARBEITEN:
Die einfachste Problemumgehung, die ich gefunden habe, war ein BindGrid bei jedem PageLoad. Aus irgendeinem Grund wird das PageIndexChanging nur auf der letzten Seite nicht ausgelöst, es sei denn, LastPageSize == PageSize. Dann wird der DataBind nicht zurückgerufen, um CommandArguments zu binden, daher kann ich nicht korrekt zurückliefern.
Andererseits ist es nicht sehr klar und könnte möglicherweise Probleme verursachen ... Mindestens doppelte Bindung = doppelte Aufrufe von SQL für Daten auf pagechange ... Ansonsten habe ich keine Ahnung, wie man PageIndexChanging hier erzwingt und scheint wie ein neues .NET-Problem für mich.
Da ich mit meiner vorgeschlagenen Lösung nicht zufrieden war (brachte zu viele Probleme für die zukünftige Entwicklung mit), habe ich mich entschieden, den Weg der "Steuerungsentwicklung" zu gehen, um sicherzustellen, dass alles korrekt erstellt wird. Es tritt auf, egal welche Art von PagerTemplate ich verwende - ich benutze eine, das Postback feuert nicht von der letzten Seite. Hoffentlich bin ich nicht der Einzige: -)
Für diejenigen, die die gleichen Probleme haben, stelle ich ein benutzerdefiniertes Steuerelement zur Verfügung, das OK funktioniert (implementiert natürlich nicht PagerSettings und PagerTemplates, aber bringt die grundlegenden Funktionen mit).
%Vor%Stellen Sie einfach sicher, dass Ihr Markup lautet: - AllowPaging="wahr" - AllowCustomPaging="false" - PageSize="was auch immer" - und Sie stellen VirtualItemCount immer noch in Code hinter
bereitCode hinter SelectMethod könnte wie folgt aussehen:
%Vor%Da ich mehrere serverseitige Steuerelemente für .NET mit einem exzellenten Bootstrap-Framework erstellt habe, habe ich hier einen Git erstellt Ссылка Wo setze ich Kontrollen, die in einem Bootstrap richtig rendern.
Ich fand das auch für mich möglich. Bei einem Postback würde die letzte Seite die letzte Seite mit Zeilen von der ersten Seite "füllen", mit Ausnahme der ersten Zeile nach den Daten. Beispiel: Wenn die Seitengröße 10 war und ich 25 Zeilen hatte. Die letzte Seite würde anfänglich die Zeilen 21-25 anzeigen und dann auf einem Postback die Zeilen 7-10.
Ich habe den folgenden "Hack" zu RowCreated der Gridview hinzugefügt, um das Zeichnen dieser Phantomzeilen zu verhindern. GV ist die Gitteransicht. DataRowCount ist eine Funktion, die die Anzahl der Zeilen aus der Datenquelle zurückgibt. PageIndex ist eine Eigenschaft verwendet eine Sitzung, um den aktuellen Seitenindex zu halten.
%Vor%Und dann habe ich folgende Funktion hinzugefügt:
%Vor%Da RowCreated vor dem Laden von ViewState ausgeführt wird, war der PageIndex des GV nicht verfügbar. Also habe ich eine Eigenschaft erstellt, die den PageIndex enthält. Mein Code aktualisiert nun die neue Eigenschaft und die Eigenschaft speichert sie in der Sitzung und aktualisiert die Eigenschaft des GV. Und das ist die Eigenschaft, die ich hinzugefügt habe
%Vor%