2011-05-17 49 views
3

我已經把自己變成了一個在網格中使用動態控件的泡菜。Gridview分類和分頁動態生成控件

我將gridview綁定到列表,然後添加dyanmic控件。爲了保持控制狀態,我需要在頁面加載中做到這一點。然而,因爲事件在頁面加載後觸發,我無法正確處理排序和分頁事件。有什麼創造性的解決方案來解決這個問題嗎?或者我對這一切都有錯?

編輯:我不知道我解釋我的問題是否正確。在生命週期中添加動態控件的位置並不重要。問題在於排序和分頁事件要求我重新綁定GridView,這顯然會導致分配給我的動態控件的屬性在ViewState中丟失,因爲排序和分頁的綁定發生在生命週期的後期。

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(); 
} 
+0

檢查此線程,它可能給你的想法http://stackoverflow.com/questions/5947780/how-to-convert-a-gridview-to-datatable-and-sort-the-datatable/5947912#5947912 – 2011-05-17 16:42:31

回答

1

那麼,我的答案是重新思考我是如何攻擊這個問題的。我擺脫了動態鏈接按鈕,而是添加了一個按鈕字段。這樣我就可以綁定gridview,並且它的控制狀態並不重要。這是一個幫助我的頁面。

http://msdn.microsoft.com/en-us/library/bb907626.aspx

0

你應該寫你的代碼頁PreRender事件Page對象創造所需爲了渲染頁面的所有控件,包括複合控件的子控件後
ASP.NET Page Life Cycle Overview
PreRender引發的事件。

0

您需要使用GridView的OnRowCreated事件添加動態控件才能處理它們的狀態。在頁面加載之前以及每次調用網格上的DataBind()方法時,會在每次回發時自動觸發OnRowCreated事件。

只有實際的數據綁定應該在OnRowDatabound事件中。

你也不應該在每次回發時重新綁定你的網格。

+0

我認爲這是一個很好的建議,但是我添加到動態鏈接按鈕的命令事件仍然不會觸發,所以我不確定它是否解決了我的問題。除非我錯過別的東西。 – plntxt 2011-05-17 17:27:41

+0

在我的特殊情況下,我需要這樣做來爲網格的每一列的標題添加一個自定義過濾器。我使用'OnRowCreated'事件來創建並添加一個DropDownList併爲其添加一些過濾器值。當我以後需要添加排序時,我排序了數據源(不是網格本身),然後重新啓動網格。 – 2011-05-17 17:53:19

0

你搞錯了吧,你要刪除的Page_Load這兩條線路():

grdProducts.DataSource = GetDataSource(); 
grdProducts.DataBind(); 

當我dinamicaly綁定數據源在我的控制,我必須重寫像這樣的OnInit,並採取兩線,並把它有:

protected override void OnInit(EventArgs e) { 
    grdProducts.DataSource = GetDataSource(); 
    grdProducts.DataBind(); 
    base.OnInit(e); 
} 

然後,它維護狀態,因爲它在頁面的ViewState的初始化之前。正如托馬斯所說,看看他給你的鏈接。

注意:對不起,我是來自魁北克和通常說法語的英語。