代码改变世界

ASP.NET 2.0 中的 DataSource 系列控件

2006-10-22 15:41  Cat Chen  阅读(928)  评论(6编辑  收藏

在ASP.NET 2.0中,引入了DataSource系列控件,扔一个到页面上并且选择性的配置好SELECT/UPDATE/INSERT/DELETE对应的操作,它就能够和数据空间无缝合作自动处理查询与更新,并且提供分页、排序等支持。

有一些ASP.NET 1.x的程序员,并不喜欢使用DataSource控件,觉得还是按找1.x的写法在Page_Load里面设定数据控件的DataSource属性然后执行DataBind好,但实际上2.0的数据控件为DataSource控件做了不少优化所以应该尽量使用DataSource控件。我在使用2.0的过程中DataSource控件和手动DataBind都尝试过了,并且借助Reflector分析.NET自带控件的代码,发现了其中的一些差异。

首先要说的是,数据控件对于是否使用DataSource控件是非常敏感的,很多操作数据控件都会检查自己的DataSourceID属性是否为空,如果不为空则很多事情都能够配合DataSource控件自动化完成,如果为空则通过事件通知用户需要手动完成一些操作。

例如GridView的分页,在使用DataSource控件的时候是能够自动运作的,在翻页时GridView会自动将PageIndex设置为GridViewPageEventArgs.NewPageIndex,同时设置RequiresDataBinding为true,接下来的事情就如魔术般自动发生——GridView会重新执行DataBind,这时候它会懂得自己去找DataSource控件获取DataSourceView,然后从DataSourceView中获取本页数据并进入创建子控件环节。如果你提供给DataSource控件的SELECT方法本身就支持通过传递参数选择仅获取某一页的数据,那么DataSource控件就懂得仅获取GridView所需页的数据以及总页数。

但如果没有DataSource控件,只是指定DataSource并且DataBind,那就会提示GridView未设置OnPageIndexChanging事件,其实意思就是你必须自己手动处理这个事件。对于DataSource从来都是整个GridView显示的数据这种情况来说,自己添加一个OnPageIndexChanging事件并在其中手动更改PageIndex属性和重新DataBind就可以解决问题了。但如果你想优化SELECT方法为仅获取当前页的数据,那就没办法了,因为你无法手动设置GridView的PageCount属性。