你真的知道 GridView 何时向 ObjectDataSource 取数据吗?

作者:vkvi 来源:ITPOW(原创) 日期:2011-5-28

这可是件复杂的事,与第一次访问还是回传有关、与 EnableViewState 有关、与是否有表单元素有关、与在哪里指定 DataSourceID 有关、与是否执行 DataBind() 有关……太多了。

本文以 GridView 和 ObjectDataSource 为例,其他 DetailsView、Repeater 等类似。

我们先谈谈取还是不取的问题

从回传入手,为什么回传要影响 GridView 何时向 ObjectDataSource 取数据呢,回传跟首次访问不一样,首次访问是铁定要去取数据,只是何时取的问题。

  • 如果 EnableViewState 为 true,那么回传就不必向 ObjectDataSource 取数据取数据了,有现成的嘛,客户端提交来的,(这里需要了解 ViewState 的作用);
  • 如果 EnableViewState 为 false,那么回传就铁定需要向 ObjectDataSource 取数据,没现成的嘛,GridView 不向 ObjectDataSource 要,向谁要?

说到 ViewState,如果用 4.0 的话,可以看看 .NET Framework 4.0-ViewStateMode 更方便地设置 ViewState

我们再看看时间问题

如果是声明式的指定 DataSourceID,即在 .aspx 页面的 asp:GridView 标签中设置 DataSourceID。那么 GridView 是在最后 Page 的 PreRender 执行完后,才向 ObjectDataSource 要数据的。

当然这个顺序也不是固定的,如果 EnableViewState 为 false,而 GridView 中又含有一个表单元素,比如文本框,那么就会很早就要数据,在 PreLoad 之前就要,为什么呢?因为要用文本框的值,必须先创建这个文本框,文本框不能从 ViewState 创建(因为 EnableViewState 为 false),就只能喊 GridView 向 ObjectDataSource 要数据了。这点可以参见为什么在 Page_Load 中创建的动态控件就取不到值,Page_Init 中创建的就能?

再说说对 GridView 进行 FindControl,它也会改变取数据的时间,因为如果现在执行了 FindControl,而数据又没有,就会将取数据的时间由 PreRender 之后,改为立即,当然,如果可从 ViewState 中取,同样也不会要求向 ObjectDataSource 取了。

又回到取与不取的问题

如果不是声明式指定 DataSourceID,而是在程序中用代码指定 DataSourceID,注意没有调用 DataBind(),那么不论什么情况,GridView 都会向 ObjectDataSource 取数据,这类似于动态设置嘛,动态设置的话,程序当然也要“动态”一下,每次都去取。这种设置有点 BT,要注意搞得程序逻辑很乱。

来个更猛的,DataBind(),这东西一来,立即执行取数据的任务,没什么悬念,但有一点要说:

前面我们都是没有调用 DataBind(),说明是 ASP.NET 自动调用的,如果在 ASP.NET 自动之前调用了 DataBind(),那么这个自动将不再执行;反过来则不成立,如果自动已经执行了,再调用 DataBind(),相当于强制再执行一次。

总之

这是个复杂问题,但研究好了后,对我们应对复杂的程序变化有很好的好处。另外我做了个测试结果,有耐心的朋友可以看一看,但仍然建议先看本文前面的分析。这个测试中,没有提到的内容,均表示使用默认值。

下载:GridView 何时向 ObjectDataSource 取数据

相关阅读

相关文章