快速业务通道

ASP.NET自定义控件 第八天 显示多个条目星级评分的列表控件

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

1. 引言

前几次任务里我们开发的星级控件只能显示一个条目的评分,在现实生活中, 经常会遇到需要向用户展示一系列数据的评分状态,例如下图所示:

ASP.NET自定义控件 第八天 显示多个条目星级评分的列表控件

本次任务里,我们将一起开发这样一个控件。

广告时间——最近在尝试写英文文章,申请了一个英文博客www.dev6.cn,欢 迎大家留下墨宝

2. 分析

通过上图可以看到,该自定义控件是一系列数据评分等级的列表,很显然需要 作为一个数据绑定控件来实现才可以灵活的显示多条数据,并且在该列表上方显 示了标题和当前的日期,为了允许用户灵活的定义标题和二级标题(当前日期) ,有必要引入模版的概念,由用户编辑模版,最终按照模版内容显示。如此看来 再使用DataBoundControl作为自定义控件的基类就不太适合了,因为我们要在该 控件中包含多个子控件,那么我们应该选择哪个类作为基类?

回忆一下第六天的任务中数据绑定控件的类关系图,其中有一个继承自 DataBoudControl类的CompositeDataBoundControl类,该类是.NET Framework 2.0中新增的一个类,用作绑定到数据源中的数据服务器控件的基类,该定义定义 如下:

public abstract class CompositeDataBoundControl : 

DataBoundControl, INamingContainer

可以看到,该在只是在继承DataBoundControl类的基础上实现了 INamingContainer,这意味着该类所包含的子控件都会生成唯一的ID属性。

但是CompositeDataBoundControl是如何实现数据绑定的呢,换句话说,如果 某一个页面包含了一个复杂数据绑定控件,在某一个服务器端控件引起回发后, 如何确保数据绑定控件能正确的被填充呢?按照设计,ASP.NET中的数据绑定组合 控件只能从数据绑定中获取数据,并且不会缓存任何绑定的数据,因此,需要提 供一个特殊的方法来处理回发事件。

再次回顾一下DataBoundControl这个类,我们来分析一下数据是如何被显示出 来的。在DataBoundControl类上重载了BaseDataBoundControl类上定义的 PerformSelect方法,该方法如下所示:

protected override void PerformSelect()
{
  if (this.DataSourceID.Length == 0)
  {
    this.OnDataBinding(EventArgs.Empty);
  }
  DataSourceView data = this.GetData();
  this._arguments = this.CreateDataSourceSelectArguments();
  this._ignoreDataSourceViewChanged = true;
  base.RequiresDataBinding = false;
  this.MarkAsDataBound();
  data.Select(this._arguments, new
  DataSourceViewSelectCallback(this.OnDataSourceViewSelectCallback));
}

该方法的关键在于不论数据源是通过DataSource属性指定还是通过 DataSourceID属性指定,最终都是通过数据源视图对象(DataSourceView)来获 取数据,在获取数据源视图之后调用了该对象的Select方法,以获取可枚举的数 据集合(不论数据源是以何种方式提供),该方法还接收多个输入参数和回调函 数。

到现在为止,我们已经可以通过为控件设置数据源数据并且通过数据源视图找 到要读取的数据,那么接下来要考虑的是,如果访问这个可绑定的数据集合以将 其显示到页面上?

答案是在数据源视图上处理Select语句操作结果的回调函数最后会调用一个可 重载的受保护方法PerformDataBinding方法,该方法定义如下:

protected internal virtual void PerformDataBinding (
  IEnumerable data
)

PerformDataBinding方法接收一个IEnumerable类型的对象以访问返回的数据 列表,我们可以利用该对象迭代访问数据并根据需要创建控件的内部结构最终呈 现给用户。

对于数据绑定组合控件,和独自处理数据绑定的控件不同,它不将数据保存到 视图中,而是交由各个子控件处理,此时,就不能通过简单的重写 CreateChildControls方

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号