本文介绍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 %>'>
Text='<%# DataBinder.Eval(Container.DataItem, "SiteName") %>'
NavigateUrl='<%# DataBinder.Eval(Container.DataItem, "SiteURL") %>'>
这个例子显示了通过(<%# … %>)实现数据绑定的语法。这些数据绑定表达式在你调用DataBind的时候得到执行。这里,控件的DataSource是这个页面的DataLinks属性,它是一些URL参考信息。
Repeater控件是唯一允许在Template中使用HTML片断的。本例中,列表被分成三段:
l
代表FooterTemplate;
l 列表的中心内容,是通过
来表现的。对SiteLinks集合里的每一个对象重复这个ItemTemplate,就产生了如图的列表内容。
你也可以在HeaderTemplate中使用,在ItemTemplate中使用…
。这样你就得到一个表格形式的列表。
你必须指定ItemTemplate。当HeaderTemplate或者FooterTemplate没有被指定时,ItemTemplate将被用作替代。
下面的代码是支持上面代码的:
namespace Samples {
...
public class Repeater1Page : Page {
protected Repeater linksListRepeater;
public ICollection SiteLinks {
get {
ArrayList sites = new ArrayList();
sites.Add(new SiteInfo("Microsoft Home",
"http://www.microsoft.com"));
sites.Add(new SiteInfo("MSDN Home",
"http://msdn.microsoft.com"));
sites.Add(new SiteInfo("MSN Homepage",
"http://www.msn.com"));
sites.Add(new SiteInfo("Hotmail",
"http://www.hotmail.com"));
return sites;
}
}
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
if (!IsPostBack) {
// DataBind the page the first time it is requested.
// This recursively calls each control within the page's
// control hierarchy.
DataBind();
}
}
}
public sealed class SiteInfo {
private string siteName;
private string siteURL;
public SiteInfo(string siteName, string siteURL) {
this.siteName = siteName;
this.siteURL = siteURL;
}
public string SiteName {
get { return siteName; }
}
public string SiteURL {
get { return siteURL; }
}
}
}
Repeater1Page类重载了Page类的OnLoad方法。我们在页面第一次被请求时候,调用DatBind方法。这样,Template里面的每一个数据绑定表达式被计算。由于Repeater可以保存它自身的数据和状态,所以用户提交数据时候,没有必要再次调用DataBind方法(也不需要指定DataSource了)。
页面公开了一个ICollection类型的SiteLinks属性。这个属性被用于指定为Repeater控件的DataSource。前面我们已经知道DataSource必须是ICollection类型的。SiteLinks就是一个简单的ArrayList,里面包含一系列的站点信息。SiteLinks属性被设置为public的,因为只有public和protected的属性在数据绑定表达式中才是可用的。
每一个SiteInfo对象有两个属性:SiteName和SiteURL。在ItemTemplate中,我们通过下面的代码来存取其属性的:
Text='<%# DataBinder.Eval(Container.DataItem, "SiteName") %>'
NavigateUrl='<%# DataBinder.Eval(Container.DataItem, "SiteURL") %>'>
(待续)