C# ASP.NET自定义服务器控件(GridView)、数据绑定和控件生命周期冲突

C# ASP.NET自定义服务器控件(GridView)、数据绑定和控件生命周期冲突,c#,asp.net,data-binding,custom-server-controls,C#,Asp.net,Data Binding,Custom Server Controls,我创建了一个自定义服务器控件(从GridView继承) 在页面上,GridView是数据绑定到数据集的,因此在设计时我不知道GridView中将显示哪些列 现在,我想做的是,在GridView标题行的每个单元格中添加一个文本框,这些文本框将控制列过滤。(文本框是使用GridView OnRowCreated方法添加的) 到目前为止一切都很好,文本框出现了,并且过滤工作正常 问题是,每次回发后,文本框的文本值都会丢失。从我的实验来看,这似乎是因为我在页面/控件生命周期中添加文本框太晚了 如果我需要

我创建了一个自定义服务器控件(从GridView继承)

在页面上,GridView是数据绑定到数据集的,因此在设计时我不知道GridView中将显示哪些列

现在,我想做的是,在GridView标题行的每个单元格中添加一个文本框,这些文本框将控制列过滤。(文本框是使用GridView OnRowCreated方法添加的)

到目前为止一切都很好,文本框出现了,并且过滤工作正常

问题是,每次回发后,文本框的文本值都会丢失。从我的实验来看,这似乎是因为我在页面/控件生命周期中添加文本框太晚了


如果我需要在生命周期的早期创建和添加文本框(如GridView的OnInit),但添加文本框取决于生命周期后期获得的信息,那么如何处理此类问题呢?

为什么不将值存储在ViewState中并重新读取(重新填充文本框)在回发时?

为什么不将值存储在ViewState中,并在回发时读取它们(重新填充文本框)?

您不必担心文本框的值,只需要它们的ID和创建它们的时间;控件状态(…hmmm…或者viewstate)将处理其余部分,只要您使用相同数量的文本框及其各自的(唯一的(!)ID创建并“提供”页面


您可以通过Page_Init和Page_Load来实现这一点……Page_Init在某种程度上是推荐的,但这取决于您的需要。

您不必担心文本框的值,只需要它们的ID和创建它们的时间;控件状态(…hmmm…或者viewstate)将处理其余部分,只要您使用相同数量的文本框及其各自的(唯一的(!)ID创建并“提供”页面


您可以通过Page_Init和Page_Load来完成此操作……Page_Init有点推荐,但这取决于您的需要。

有一个页面非常有用: 它特别指出,您需要使用Pre_Init事件来创建yout控件:

PreInit:将此事件用于 以下是:

  • 检查IsPostBack属性以确定这是否是第一个 处理页面的时间
  • 创建或重新创建动态控件
  • 动态设置母版页
  • 动态设置主题属性
  • 读取或设置配置文件属性值

这里有一个有用的页面: 它特别指出,您需要使用Pre_Init事件来创建yout控件:

PreInit:将此事件用于 以下是:

  • 检查IsPostBack属性以确定这是否是第一个 处理页面的时间
  • 创建或重新创建动态控件
  • 动态设置母版页
  • 动态设置主题属性
  • 读取或设置配置文件属性值