Gridview使用动态生成的控件进行排序和分页

|| 通过在gridivew中使用动态控件,我陷入了困境。 我将gridview绑定到列表,然后添加动态控件。为了保持控件状态,我需要在页面加载中执行此操作。但是,由于事件是在页面加载后触发的,所以我无法正确处理排序和分页事件。是否有解决此问题的创造性解决方案,或者我将这一切都弄错了吗? 编辑:我不确定我正确解释了我的问题。在生命周期中的何处添加动态控件都没有关系。问题是排序和分页事件要求我重新绑定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();
}
    
已邀请:
好吧,对我来说答案是重新考虑我是如何解决这个问题的。我摆脱了动态链接按钮,而是添加了一个按钮字段。这样,我可以将Gridview绑定到任何地方,并且它的控制状态无关紧要。这是对我有帮助的页面。 http://msdn.microsoft.com/en-us/library/bb907626.aspx     
您应该在页面的“ 1”事件中编写代码 ASP.NET页面生命周期概述 Page对象创建呈现页面所需的所有控件(包括复合控件的子控件)后引发的“ 1”事件。     
您的错误是您必须从Page_Load()中删除这两行:
grdProducts.DataSource = GetDataSource();
grdProducts.DataBind();
当我在控件上绑定数据源时,我必须像这样重写OnInit并将这两行放在那儿:
protected override void OnInit(EventArgs e) {
   grdProducts.DataSource = GetDataSource();
   grdProducts.DataBind();
   base.OnInit(e);
}
然后,它维护状态,因为它在页面的ViewState初始化之前。正如托马斯所说,看看他给你的链接。 注意:对不起我的英语,我来自魁北克,通常会说法语。     
您需要使用GridView的“ 5”事件来添加动态控件,以便能够处理它们的状态。每次页面发回之前,每次调用网格上的the7ѭ方法时,都会在每次回发时自动触发
OnRowCreated
事件。 只有实际的数据绑定才应该在
OnRowDatabound
事件中。 您也不应该在每次回发时都重新绑定网格。     

要回复问题请先登录注册