网格视图排序和分页与动态生成的控件

本文关键字:控件 动态 视图 排序 分页 网格 | 更新日期: 2023-09-27 17:56:36

我已经让自己陷入了在

网格中使用动态控件的困境。

我正在将网格视图绑定到列表,然后添加 dyyanmic 控件。 为了保持控件状态,我需要在页面加载中执行此操作。 但是,由于事件在页面加载后触发,因此我无法正确处理排序和分页事件。 这个问题有什么创造性的解决方案吗,还是我做错了?

编辑:我不确定我是否正确解释了我的问题。在生命周期中在哪里添加动态控件并不重要。 问题是排序和分页事件要求我重新绑定 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();
}

网格视图排序和分页与动态生成的控件

好吧,我的答案是重新思考我如何解决这个问题。 我摆脱了动态链接按钮,而是添加了一个按钮字段。 这样我就可以随时随地绑定网格视图,它的控制状态无关紧要。 这是一个帮助我的页面。

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

你应该在

页面
的事件PreRender编写代码ASP.NET 页面生命周期概述
PreRender Page 对象创建呈现页面所需的所有控件(包括复合控件的子控件)后引发的事件。

你的错误是你必须从 Page_Load() 中删除这两行:

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

当我在控件上绑定数据源时,我必须像这样覆盖 OnInit 并取两行并将其放在那里:

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

然后,它维护状态,因为它是在初始化页面的视图状态之前。正如托马斯所说,看看他给你的链接。

注意:对不起我的英语,我来自魁北克,通常说法语。

您需要使用 GridView 的 OnRowCreated 事件来添加动态控件,以便能够处理它们的状态。OnRowCreated 事件在每次回发时、页面加载之前以及每次在网格上调用 DataBind() 方法时自动触发。

只有实际的数据绑定才应在 OnRowDatabound 事件中。

您也不应在每次回发时重新绑定网格。