Ich habe eine GridView mit einer DataSourceID, die auf eine ObjectDataSource verweist. Die ObjectDataSource verweist auf eine Methode, die ein LINQ IQueryable mithilfe der Eigenschaften TypeName, SelectMethod und SelectCountMethod des ObjectDataSource-Steuerelements zurückgibt. Was passiert, ist, dass die Daten ordnungsgemäß im Voraus geladen werden. Wenn ich die Postsendungen jedoch aus dem GridView entferne und versuche, mit dem expliziten GridView.DataBind () zu binden, funktioniert Postback nicht. Ich weiß, dass LINQ die richtige rowcount und so zurückgibt, da ich die countmethod aufgerufen habe und die richtige Anzahl der Zeilen zurückgibt. Hier ist ein kurzes Beispiel:
%Vor%Ich habe versucht, eine Schaltfläche hinzuzufügen und das TestGridView.DataBind () hinzuzufügen; Methode dazu. Ich habe versucht, es zum Page_PreRender-Ereignis hinzuzufügen. Egal, was ich versuche, es funktioniert nicht.
Wie unten vorgeschlagen, habe ich versucht, es auch auf Page_Load zu verschieben. Hier ist ein grobes Beispiel für meinen Code:
%Vor%Nachdem ich den Code ein wenig genauer betrachtet hatte, stolperte ich über Seiteneigenschaftswerte, die in ViewState gespeichert waren. Sobald ich es in Session geändert habe, funktionieren sie.
Gridviews werden beim Postback nicht neu gebunden, ihre Zeilen werden aus dem Viewstatus zurückgezogen. Durch das Zurücksetzen der DatasourceID der Gridview auf die ID der Objektdatenquelle beim Laden der Seite (oder init?) Wird die Gridview neu gepoolt.
Dumm Idee, aber haben Sie das Seitenladeereignis mit dem if(!Page.IsPostBack)
überprüft?
Von ASP.NET Page Framework Übersicht :
Page_Load: Während dieses Ereignisses können Sie eine Reihe von Aktionen ausführen, um entweder Ihre ASP.NET-Seite zum ersten Mal zu erstellen oder auf clientseitige Ereignisse zu reagieren, die sich aus einem Beitrag ergeben. Der Seiten- und Steuerungsansichtszustand wurde vor diesem Ereignis wiederhergestellt. Überprüfen Sie mithilfe der Seiteneigenschaft IsPostBack , ob die Seite zum ersten Mal verarbeitet wird. Wenn es das erste Mal ist, führen Sie Datenbindung durch. Lesen und aktualisieren Sie auch die Steuerelementeigenschaften.
Wo als
Page_PreRender: Das PreRender-Ereignis wird ausgelöst, unmittelbar bevor der Ansichtszustand gespeichert und die Steuerelemente gerendert werden. Sie können dieses Ereignis verwenden, um letzte Änderungen an Ihren Steuerelementen vorzunehmen.
Tatsächlich
Da das Seitenframework ein statusloses und getrenntes Modell ist, treten jedes Mal, wenn ein Client eine ASPX-Seite anfordert, während der Seitenverarbeitung viele Dinge auf ...
In der Tat könnten Sie Ihre Prüfung vor dem Setzen des Viewstate durchführen, anstatt nach der Wiederherstellung des Viewstates. Der häufigste Ort, an dem nach if(!Page.IsPostBack)
gesucht wird, befindet sich normalerweise im Page_Load-Ereignis.
Ihr Beispiel zeigt
%Vor%Aber meintest du wirklich
? %Vor%(und ist das das Problem?)
Ich hatte ein ähnliches Problem mit der dynamischen Bindung einer TreeView an eine XmlDataSource, die die XML-Quelle bei jedem Postback änderte. Setzen Sie EnableCache auf "false". Hast du das versucht? (Beachten Sie, dass das Linq2sql-Objekt bereits zwischengespeichert wird, wenn Ihr IQueryable ein Linq2sql-Objekt verwendet, dh)
%Vor%Wenn das nicht funktioniert, versuchen Sie es mit dem oben genannten:
%Vor%Ich hatte eine ähnliche Situation, in der die aktualisierten Werte einer Zeile nicht angezeigt wurden, egal wie ich nach der Aktualisierung versucht habe, eine Datenbank zu erstellen.
Das GridView
wurde an ein ObjectDataSource
gebunden, und das Problem trat auf, nachdem ich sein Hintergrundobjekt von einem DataSet
auf ein Entity Framework
query
Die Aktivierung von ViewState
für GridView
hat mir den folgenden Trick eingebracht:
Tags und Links data-binding asp.net gridview objectdatasource