主题:  ASP.NET的数据绑定技术(一)(作者:DarkMan)

tyc32

职务:普通成员
等级:1
金币:0.0
发贴:21
#12001/3/12 15:43:35
本文介绍ASP.NET的Repeater,DataList,and DataGrid

服务器端控件。这些控件将数据集合表现为基于HTML的界面。本文还引入了利用这些控件的几个例子。

简介

Repeater、DataList 、DataGrid控件是System.Web.UI.WebControls名空间(Namespace)里几个相关的页面组件。这些控件把绑定到它们的数据通过HTML表现出来,它们又被成为“列表绑定控件”(list-bound controls)。

和其他Web组件一样,这些组件不仅提供了一个一致的编程模型,而且封装了与浏览器版本相关的HTML逻辑。这种特点使得程序员可以针对这个对象模型编程,而无须考虑各种浏览器版本的差别和不一致性。

这三个控件具有把它们的相关数据“翻译”成各种外观的能力。这些外观包括表格、多列列表、或者任何的HTML流。同时,它们也允许你创建任意的显示效果。除此之外,它们还封装了处理提交数据、状态管理、事件激发的功能。最后,它们还提供了各种级别的标准操作,包括选择、编辑、分页、排序等等。利用这些控件,你可以轻松地完成如下的Web应用:报表、购物推车、产品列表、查询结果显示、导航菜单等等。

下面我们进一步讲解这些控件,其基本使用方法和如何选用它们。

列表绑定控件是如何工作

下面我们来看看列表绑定控件的属性和方法,从而一窥其内在工作机理。

DataSource属性
Repeater、DataList、DataGrid都是从System.Collections.Icollection继承来的,所以都带有DataSource属性。DataSource,最简单地讲,就是一组相同特征的对象或者一个相同对象的集合。

在ASP.NET 框架里,有许多对象都有DataSource属性。包括System.Data.DataView和ArrayList、HashTable等等。

和其他传统的需要ADO Recordset的数据绑定控件不同,这些列表绑定控件只需要实现其ICollection接口,而不必一定指定其DataSource属性。而且,由于其DataSource属性允许为很多数据类型和数据结构,从而使这些对象的引用更加简单和灵活。

Items集合

每一个列表绑定控件都有一个Items集合,集合中的每一个Item是DataSource所指定的一个对象。

下表列示的是和DataSource指定数据相关联的Item类型

Item
缺省类型的一个Item

AlternatingItem
Items集合中奇数编号的一个Item

SelectedItem
当前选中的Item

EditItem
当前编辑的Item



下面列示的是和DataSource指定数据无关的Item类型

Header
用于表达列表表头

Footer
用于表达列表表尾

Separator
用于表达两个Item之间的内容。只适用于Repeater和DataList

Pager
用于分页显示数据集合。适用于DataGrid控件。


数据绑定和Item集合的创建

列表绑定控件基于ASP.NET框架,需要你明确地进行数据绑定。这就意味着:只有当DataBind方法被调用时,才真正需要轮询其DataSource所代表的数据。

当DataBind方法被调用时,列表绑定控件将轮询DataSource,创建Items集合,并从DataSource取回数据,以初始化Items集合。如果状态管理被激活,这些控件将自动保存所需要的信息,当用户提交数据时,不再需要你指定DataSource属性。

明确的DataBind调用使你可以准确地决定什么时候DataSource是需要准备好的,同时也减少了和数据库的交互,从而提高了WEB应用的性能。

一般的规则是:当你需要重建所有的Items时候,你需要调用DataBind。大多数情况下,你只需要在页面第一次被请求的时候,调用DataBind。在以后的页面运行中,你只需要在相应的事件中,比如引起Items集合变化的事件,或者和数据源关联的查询条件发生了变化,或者数据将从只读模式改变到编辑模式,这时候就需要调用DataBind方法。

Style属性

通过使用对象模型的Style属性,你可以定义整个DataList或者DataGrid的外观。这些属性允许你指定字体、颜色、边框以及其表现风格。这些控件自身的属性,包括ForeColor、BackColor、Font和BorderStyle,将影响整个控件的表现风格。

另外,对于控件包含的每个Item,通过指定ItemStyle、AlternatingItemStyle、HeaderStyle,也可以控制相应Item的外观表现。对于DataGrid,你还可以控制到每个列的每个单元,只需要指定HeaderStyle、FooterStyle和ItemStyle。

Template模板

Style控制列表绑定控件的可见格式,而template则定义了内容和每个Item的表现。你可以把Template想象成一小段HTML代码,通过它决定了如何把每个Item显示给用户。

Repeater和DataList通过你指定的模板来工作,这些模板包括ItemTemplate、AlternatingItemTemplate、HeaderTemplate。

DataGrid控件不使用模板。但是,在此控件的Columns集合里使用TemplateColumns是可以的,而且TemplateColumns里的每一个TemplateColumn都可以包含一个模板,就象Repeater和DataList里的一样。这样你也可以定制每一个DataGrid的表现形式。

模板里的数据绑定

一个模板Template定义了一个Item所包含的控件结构。使用数据绑定表达式,这个结构里的控件属性可以绑定到和这个Item关联的数据属性。

Item从逻辑上来看,是相应Template的父亲,可以通过“Container”来引用。每个Container都有DataItem属性,所以在构造Template的每个数据绑定表达式时候,Container.DataItem常常出现。这些我们从后面的例子里也可以学习到。

Repeater控件

正如前面讲到的,Repeater完全是模板驱动的。对同样的DataSource,通过应用不同的模板,你可以得到不同的外观表现。

我们来看看下面的代码:

<%@ Page language="C#" src="Repeater1.cs" inherits="Samples.Repeater1Page"%>

...


DataSource='<%# SiteLinks %>'>









这个例子显示了通过(<%# … %>)实现数据绑定的语法。这些数据绑定表达式在你调用DataBind的时候得到执行。这里,控件的DataSource是这个页面的DataLinks属性,它是一些URL参考信息。

Repeater控件是唯一允许在Template中使用HTML片断的。本例中,列表被分成三段:

l
    代表HeaderTemplate;

    l
代表FooterTemplate;

l 列表的中心内容,是通过
  • 来表现的。对SiteLinks集合里的每一个对象重复这个ItemTemplate,就产生了如图的列表内容。

    你也可以在HeaderTemplate中使用,在FooterTemplate中使用
    ,在ItemTemplate中使用