ASP.NET控件开发基础(21)

上篇介绍了在asp.net2.0版本下面如何简单的定义数据绑定控件。虽然DataBoundControl为我们提供了便利,我们以后可以从此类开始编写数据绑定控件。但是在2.0版本未到来之前,你已经为自己订制了一些数据绑定控件,既然2.0版本已经提供了数据源控件,你是否有想法,让你原有的控件也升级到同时支持通过设置DataSource属性和数据源控件来获取数据源,这样以后我们就可以省省工作了。这次我们就来讨论这个话题,让旧版本的数据绑定控件支持数据源控件。

一.准备升级数据绑定控件

即使asp.net1.1版本的一些控件也都已经支持数据源控件了,如Repeater,BaseDataList等.但本身这些对象并不是从BaseDataBoundControl和DataBoundControl等类继承下来的,如Repeater其是从Control下继承的一个模板控件,其并不需要这么多从WebControl继承下来的属性,如果你想让它支持数据源控件,你首先会想到改变控件基类,从DataBoundControl开始,这是一个好想法,但可能有些情况下并不允许这么做。上次说到了BaseDataList和DataBoundControl,BaseDataList也支持数据源控件了,所以我认为从此类继承是完全没有问题的。另外的做法就是在不改变原有控件基类的情况下,你还是需要老老实实给原控件添加一些代码支持数据源控件。那么就开始吧.

二.具体实现

本次例子跟上篇相同,相同地方就略过了

1.定义基本成员

整个控件的实现方式跟DataBoundControl实现方式很相似,我们可以看看MSDN中,BaseDataList等基类添加了哪些元素,然后模仿着实现.如果对BaseDataBoundControl和DataBoundControl这两个类成员了解的话,你将对下面成员属性很熟悉,添加这些基本成员

(1)

/// <summary>
/// 该值指示控件是否已经初始化
/// </summary>
protected bool Initialized
{
   get { return initialized; }
}

public string DataMember
{
   get
   {
     object member = ViewState["DataMember"];
     if (member == null)
       return string.Empty;
     else
       return (string) member;
   }
   set
   {
     ViewState["DataMember"] = value;
     this.OnDataPropertyChanged();
   }
}

/// <summary>
/// 为数据绑定控件提供数据源
/// </summary>
public IEnumerable DataSource
{
   get { return dataSource; }
   set
   {
     if ((value is IEnumerable) || (value is IListSource) || (value == null))
       dataSource = value;
     else
       throw new Exception("错误的数据源类型");
     OnDataPropertyChanged();
   }
}

/// <summary>
/// 数据源控件的 ID 属性
/// </summary>
[DefaultValue(""), IDReferenceProperty(typeof(DataSourceControl))]
public virtual string DataSourceID
{
   get
   {
     object dataSourceID = ViewState["DataSourceID"];
     if (dataSourceID != null)
     {
       return (string) dataSourceID;
     }
     return string.Empty;
   }
   set
   {
     this.ViewState["DataSourceID"] = value;
     this.OnDataPropertyChanged();
   }
}

/// <summary>
/// 获取是否设置 DataSourceID 属性的值
/// </summary>
protected bool IsBoundUsingDataSourceID
{
   get { return (DataSourceID.Length > 0); }
}

/// <summary>
/// 是否需要绑定到其指定的数据源
/// </summary>
protected bool RequiresDataBinding
{
   get { return requiresDataBinding; }
   set { requiresDataBinding = value; }
}

/// <summary>
/// 用于检索数据的 DataSourceSelectArguments 对象。默认为 Empty 值
/// </summary>
protected DataSourceSelectArguments SelectArguments
{
   get
   {
     if (selectArguments == null)
     {
       selectArguments = CreateDataSourceSelectArguments();
     }
     return selectArguments;
   }
}

时间: 2025-01-30 06:01:06

ASP.NET控件开发基础(21)的相关文章

一起谈.NET技术,asp.net控件开发基础(21)

上篇介绍了在asp.net2.0版本下面如何简单的定义数据绑定控件.虽然DataBoundControl为我们提供了便利,我们以后可以从此类开始编写数据绑定控件.但是在2.0版本未到来之前,你已经为自己订制了一些数据绑定控件,既然2.0版本已经提供了数据源控件,你是否有想法,让你原有的控件也升级到同时支持通过设置DataSource属性和数据源控件来获取数据源,这样以后我们就可以省省工作了.这次我们就来讨论这个话题,让旧版本的数据绑定控件支持数据源控件. 一.准备升级数据绑定控件 即使asp.n

一起谈.NET技术,asp.net控件开发基础(20)

上面我们讨论了数据绑定控件的做法,但都未涉及到asp.net2.0中数据源控件的用法,让用惯了数据源控件的人可能感觉不适应.这次我们就开始讨论在asp.net2.0中,我们该如何重新定义数据绑定控件.我一直在想,是先讨论数据源控件呢,还是先讨论数据绑定控件,两者是密不可分的.在看下文之前,我想大家应该对asp.net2.0中的数据源控件使用的简易性非常熟悉了.记得园子的开源项目NBear也为大家提供了数据源控件.个人认为数据源控件和数据绑定控件之间存在着一些约定关系,学习还当从易到难,这里就假定

一起谈.NET技术,asp.net控件开发基础(22)

上两篇讨论了如何定义结合数据源控件的数据绑定控件.这次我们一起来看下数据源控件是如何实现的.asp.net2.0已经为我们提供了很多数据源控件,相信大家都用过了,也希望大家对其有所熟悉.关于它能做什么就不说了.下面我们也一起来看看,如何简单的实现. 一.你必须了解的 1.关于数据源控件(DataSourceControl) 虽然表面看来,给数据绑定控件指定DataSourceID属性,数据源控件帮你做了一切工作,其实不然,数据源控件只负责收集与数据交互的相关信息,如:SqlDataSource的

一起谈.NET技术,asp.net控件开发基础(9)

写第五篇的时候,我一步步的加上元数据(特性),使得设计时效果更加好,如对复杂属性应用以下特性,使属性浏览器支持扩展/折叠效果,使你更加容易编辑子属性,但接着我又遇到了问题,所以必须去解决 1.认识默认属性浏览器支持 让我们再认识一下属性,大家知道每个属性都是有类型的,最熟悉就是string,int这些类型了,vs2005属性浏览器对这些属性类型进行了识别, 如下例子 (1)table控件的Height属性,当你设置属性为字符串时,则提示错误信息 (2)当属性类型为Color属性时,属性浏览器为你

一起谈.NET技术,asp.net控件开发基础(5)

我们根据属性的不同表现形式,把其区分为简单属性和复杂属性,下面来看下属性的表现形式.简单属性表现形式如下,大家都很熟悉 <asp:TextBox ID="TextBox1" Text="textbox控件" runat="server"></asp:TextBox> 属性中含有子属性,称之为复杂对象,如Font属性,复杂属性的表现形式如下: (1)连字符的表现形式 <asp:TextBox ID="Text

一起谈.NET技术,asp.net控件开发基础(17)

本篇将开始介绍如自定义数据绑定控件,这里感谢很多人的支持,有你们的支持很高兴.这里首先需要大家熟悉asp.net模板控件的使用,还有自定义模板控件.因为数据绑定控件多是基于模板控件的. 一.回顾 如果你使用过asp.net内置的数据控件(如DataList,Repeater),你一定会这么做 1.设置数据源 DataSource属性 2.调用数据绑定  DataBind方法 3.在控件的不同模板内使用绑定语法显示数据 这三步应该是必须要做的 其他更多的 你可能需要对绑定的数据进行统一的一些操作(

一起谈.NET技术,asp.net控件开发基础(15)

继续我们的话题吧.自定义控件.如果你还不熟悉自定义控件开发的话,还请看看我以前写了几篇,希望对你有帮助 1.1何处继承 自定义控件一般从以下几个基类(此处不包含数据控件) 一.Control类(所有服务器控件的基类,算是比较底层的类,如果控件功能比较简单,要求不多,可直接继承此类.) 二.WebControl类(标准控件的基类,继承此类,你可以继承其丰富的公共属性,若标准控件中的控件没有你需要的控件,你可以继承此类) 三.CompositeControl 类(2.0新增的类,此类继承自WebCo

一起谈.NET技术,asp.net控件开发基础(13)

1.减轻服务器压力,增加用户体验 服务器功能是强大的,客户端脚本一点也不弱,现在的ajax技术和Atlas技术就是最好的证明,我们总是期待UI有一个好的效果,flash动画给我们带来了很酷的效果,我们至少也可以为我们的服务器控件添加客户端脚本,一方面减少了服务器端的回传,一方面又能为控件提供非常酷的效果.我想我们都很喜欢ATLAS里面很多很酷的控件吧,而且无刷新,服务器控件与客户端脚本交互使用,那会服务器控件变的更加完美. 经过上面的废话,下面我们进入正题 2.简单为服务器控件添加客户端脚本 我

一起谈.NET技术,asp.net控件开发基础(10)

集合属性相信大家都很熟悉也很常用,如DropDownList,ListBox等控件 <asp:DropDownList ID="DropDownList1" runat="server">            <asp:ListItem>测试1</asp:ListItem>            <asp:ListItem>测试2</asp:ListItem>            <asp:Lis