Gridview-Sortierung und Paging mit Dynamisch Erzeugten Controls
Habe ich mich in einer Essiggurke mit dynamischen Steuerelementen in einem gridivew.
Bin ich verbindlich die gridview-Komponente auf eine Liste und bin dann hinzufügen dyanmic kontrolliert. Zum halten der Kontrolle Stand ich muss die Seite laden. Da jedoch die Ereignisse, die ausgelöst werden, nachdem das laden der Seite bin ich nicht in der Lage, ordnungsgemäß zu behandeln Sortier-und paging-Ereignisse. Gibt es kreative Lösungen für dieses problem, oder bin ich da über diese alle falsch?
EDIT: ich bin nicht sicher, ich erklärte mein problem richtig. Es spielt keine Rolle, wo ich die dynamische Steuerelemente im Lebenszyklus. Das problem ist, dass die Sortierung und paging-Ereignisse erfordern mich zu binden das GridView, die (scheinbar) bewirkt, dass die Eigenschaften zugewiesen, um meine dynamische Steuerelemente verloren von ViewState, da die Bindung auf das Sortieren und paging geschieht spät im Lebenszyklus.
protected void Page_Load(object sender, EventArgs e)
{
//NOTE: to maintain control state of dynamic controls all databinding needs to be done in page load.
grdProducts.DataSource = GetDataSource();
grdProducts.DataBind();
}
protected void grdProducts_OnRowDatabound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType != DataControlRowType.DataRow) return;
ManufacturerProduct m = new ManufacturerProduct();
m.Model = DataBinder.Eval(e.Row.DataItem, "Model").ToString();
PlaceHolder ph = new PlaceHolder();
ph = (PlaceHolder)e.Row.FindControl("phAddToCart");
LinkButton lb = new LinkButton();
lb.Text = "Add To Cart";
//NOTE: if I bind after page load the command never fires.
lb.Command += new CommandEventHandler(AddItem);
lb.CommandName = "AddItem";
lb.CommandArgument = m.Model;
ph.Controls.Add(lb);
}
protected void grdProducts_OnSorting(object sender, GridViewSortEventArgs e)
{
//NOTE: since events fire after page load I can't handle this properly.
hfSortExpression.Value = e.SortExpression.ToString();
grdProducts.PageIndex = 0;
//NOTE: If I rebind here I hose my dynamic controls
//grdProducts.DataSource = GetDataSource();
//grdProducts.DataBind();
}
- Überprüfen Sie diesen thread, Es kann Ihnen eine Idee stackoverflow.com/questions/5947780/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, die Antwort war für mich zu überdenken, wie ich angegriffen das problem. Ich entledigte sich die dynamische linkbutton und fügte hinzu, ein button-Feld statt. So konnte ich binden Sie das gridview-wo immer und-Kontrolle Zustand egal. Hier ist eine Seite, die mir geholfen haben.
http://msdn.microsoft.com/en-us/library/bb907626.aspx
Sollten Sie Ihren code schreiben, in
PreRender
- Ereignis der SeiteASP.NET Seite Übersicht über den Lebenszyklus
PreRender
event ausgelöst, nachdem das Page-Objekt geschaffen hat, alle Steuerelemente, die erforderlich sind, um die Seite zu Rendern, einschließlich der untergeordneten Steuerelemente der zusammengesetzte Steuerelemente.Ihre Fehler, die Sie haben, entfernen Sie diese zwei Zeilen aus Page_Load() :
Wenn ich dinamicaly binden datasource auf meine Steuern, ich muss Vorrang vor der OnInit wie diese, und nehmen Sie die zwei Linien und legen Sie es dort :
Dann, es unterhält Staaten, weil es vor der Initialisierung der ViewState der Seite. Wie Thomas schon sagte, bekommen Sie einen Blick auf die links, die er dir gegeben hat.
Hinweis : Sorry für mein Englisch, ich bin aus Quebec und in der Regel sprechen Französisch.
Müssen Sie die
OnRowCreated
- Ereignis des GridView-Steuerelements zum hinzufügen von dynamischen Steuerelementen in der Lage sein zu handhaben Zustand von Ihnen. DieOnRowCreated
- Ereignis ausgelöst wird, automatisch bei jedem postback, bevor das laden der Seite und jedes mal, wenn Sie rufen Sie dieDataBind()
Methode auf dem Gitter.Nur das eigentliche databinding sollte in der
OnRowDatabound
Veranstaltung.Sollten Sie auch nicht binden Sie in Ihrem raster jedem postback.
OnRowCreated
Ereignis zu erstellen, und fügen Sie eine DropDownList und fügen Sie einige filter Werte. Wenn ich später benötigt, um zu Sortieren, ich sortierte Sie die datasource (nicht das Gitter selbst) und dann rebound das raster.