我已经把自己变成了一个在网格中使用动态控件的泡菜。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();
}
检查此线程,它可能给你的想法http://stackoverflow.com/questions/5947780/how-to-convert-a-gridview-to-datatable-and-sort-the-datatable/5947912#5947912 – 2011-05-17 16:42:31