C# 具有动态生成控件的Gridview排序和分页

C# 具有动态生成控件的Gridview排序和分页,c#,asp.net,sorting,gridview,dynamic-controls,C#,Asp.net,Sorting,Gridview,Dynamic Controls,在gridivew中使用动态控件让我陷入了困境 我将gridview绑定到一个列表,然后添加动态控件。为了保持控件状态,我需要在页面加载中执行此操作。然而,由于事件在页面加载后触发,我无法正确处理排序和分页事件。这个问题有没有创造性的解决方案,或者我是不是完全错了 编辑:我不确定我是否正确地解释了我的问题。我在生命周期中的何处添加动态控件并不重要。问题是排序和分页事件要求我重新绑定GridView,这(显然)会导致分配给动态控件的属性从ViewState中丢失,因为排序和分页的绑定发生在生命周期

在gridivew中使用动态控件让我陷入了困境

我将gridview绑定到一个列表,然后添加动态控件。为了保持控件状态,我需要在页面加载中执行此操作。然而,由于事件在页面加载后触发,我无法正确处理排序和分页事件。这个问题有没有创造性的解决方案,或者我是不是完全错了

编辑:我不确定我是否正确地解释了我的问题。我在生命周期中的何处添加动态控件并不重要。问题是排序和分页事件要求我重新绑定GridView,这(显然)会导致分配给动态控件的属性从ViewState中丢失,因为排序和分页的绑定发生在生命周期的后期


您应该在页面的
PreRender
事件中编写代码


PreRender
页面对象创建呈现页面所需的所有控件(包括复合控件的子控件)后引发的事件

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

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


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

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

当我在控件上动态绑定datasource时,我必须像这样覆盖OnInit,并将两行放在那里:

protected override void OnInit(EventArgs e) {
   grdProducts.DataSource = GetDataSource();
   grdProducts.DataBind();
   base.OnInit(e);
}
然后,它会维护状态,因为它在初始化页面的ViewState之前。正如托马斯所说,看看他给你的链接


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

嗯,我的答案是重新思考我是如何解决这个问题的。我去掉了动态链接按钮,而是添加了一个按钮字段。这样我就可以将gridview绑定到任何不重要的地方,它的控件状态也不重要。这里有一页帮助了我


检查此线程,它可能会让您了解我认为这通常是一个很好的建议,但我添加到动态链接按钮的命令事件仍然不会触发,因此我不确定它是否解决了我的问题。除非我遗漏了其他内容。在我的特殊情况下,我需要这样做,以便在网格的每一列的标题中添加一个自定义过滤器。我使用
OnRowCreated
事件来创建和添加一个DropDownList,并向其中添加一些过滤器值。当我以后需要添加排序时,我对数据源(而不是网格本身)进行排序,然后恢复网格。
grdProducts.DataSource = GetDataSource();
grdProducts.DataBind();
protected override void OnInit(EventArgs e) {
   grdProducts.DataSource = GetDataSource();
   grdProducts.DataBind();
   base.OnInit(e);
}