asp.net控件开发基础(21)
2008-12-19 17:13
295 查看
示例代码
上篇介绍了在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)
protected bool Initialized
public string DataMember
public IEnumerable DataSource
[DefaultValue(""), IDReferenceProperty(typeof(DataSourceControl))]
public virtual string DataSourceID
protected bool IsBoundUsingDataSourceID
protected bool RequiresDataBinding
protected DataSourceSelectArguments SelectArguments
protected virtual DataSourceSelectArguments CreateDataSourceSelectArguments()
protected void EnsureDataBound()
protected virtual void OnDataPropertyChanged()
// 从容器中获取DataControl
private Control FindControl(Control control, string controlID)
protected virtual IDataSource GetDataSource()
private DataSourceView ConnectToDataSourceView()
protected virtual DataSourceView GetData()
if (this.currentDataSource == null)
public class ReadOnlyDataSource : IDataSource
public class ReadOnlyDataSourceView : DataSourceView
public override void DataBind()
private void OnDataSourceViewSelectCallback(IEnumerable retrievedData)
protected override void OnInit(EventArgs e)
private void OnPagePreLoad(object sender, EventArgs e)
protected override void OnPreRender(EventArgs e)
protected override void OnLoad(EventArgs e)
{
this.initialized = true;
this.ConnectToDataSourceView();
if (this.Page != null && this.ViewState["DataBound"] == null)
{
if (!this.Page.IsPostBack)
{
this.RequiresDataBinding = true;
}
else if (base.IsViewStateEnabled)
{
this.RequiresDataBinding = true;
}
}
base.OnLoad(e);
}
好了,基本代码的编写就完成了,接着你就可以通过设置DataSource属性手动绑定的形式和设置DataSourceID属性获取数据源的形式获取数据了。
这篇可以供参考,如果真要这么做的话,几乎每个原有的数据绑定控件都需要重复编写上面这么多代码。相比之下如DataBoundControl类和BaseDataList类都已经帮你完成了上面的工作,在有选择的情况下,我们当然不愿意写上面这么多的代码。所以说上面的这堆代码也只供你参考,能够使用新的基类的话,尽量使用,如果真的需要这么做的话,你就需要这么去改你的数据绑定控件。
这篇可能讲的不是很详细,大家如果真的有必要这么做的话,可以仔细看看。不足之处还请大家纠正^_^.
晚了,睡觉去了。
上篇介绍了在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)
protected bool Initialized
public string DataMember
public IEnumerable DataSource
[DefaultValue(""), IDReferenceProperty(typeof(DataSourceControl))]
public virtual string DataSourceID
protected bool IsBoundUsingDataSourceID
protected bool RequiresDataBinding
protected DataSourceSelectArguments SelectArguments
protected virtual DataSourceSelectArguments CreateDataSourceSelectArguments()
protected void EnsureDataBound()
protected virtual void OnDataPropertyChanged()
// 从容器中获取DataControl
private Control FindControl(Control control, string controlID)
protected virtual IDataSource GetDataSource()
private DataSourceView ConnectToDataSourceView()
protected virtual DataSourceView GetData()
if (this.currentDataSource == null)
public class ReadOnlyDataSource : IDataSource
public class ReadOnlyDataSourceView : DataSourceView
public override void DataBind()
private void OnDataSourceViewSelectCallback(IEnumerable retrievedData)
protected override void OnInit(EventArgs e)
private void OnPagePreLoad(object sender, EventArgs e)
protected override void OnPreRender(EventArgs e)
protected override void OnLoad(EventArgs e)
{
this.initialized = true;
this.ConnectToDataSourceView();
if (this.Page != null && this.ViewState["DataBound"] == null)
{
if (!this.Page.IsPostBack)
{
this.RequiresDataBinding = true;
}
else if (base.IsViewStateEnabled)
{
this.RequiresDataBinding = true;
}
}
base.OnLoad(e);
}
好了,基本代码的编写就完成了,接着你就可以通过设置DataSource属性手动绑定的形式和设置DataSourceID属性获取数据源的形式获取数据了。
这篇可以供参考,如果真要这么做的话,几乎每个原有的数据绑定控件都需要重复编写上面这么多代码。相比之下如DataBoundControl类和BaseDataList类都已经帮你完成了上面的工作,在有选择的情况下,我们当然不愿意写上面这么多的代码。所以说上面的这堆代码也只供你参考,能够使用新的基类的话,尽量使用,如果真的需要这么做的话,你就需要这么去改你的数据绑定控件。
这篇可能讲的不是很详细,大家如果真的有必要这么做的话,可以仔细看看。不足之处还请大家纠正^_^.
晚了,睡觉去了。
相关文章推荐
- asp.net控件开发基础(21)
- 一起谈.NET技术,asp.net控件开发基础(21)
- asp.net控件开发基础(21)
- asp.net控件开发基础(21)
- asp.net控件开发基础(17)
- asp.net控件开发基础(18)
- asp.net控件开发基础(2) ----------明白使用Render方法呈现自定义控件
- asp.net控件开发基础(23)
- asp.net控件开发基础(23)
- ASP.NET 控件开发基础
- asp.net控件开发基础(2)
- asp.net控件开发基础系列
- asp.net控件开发基础(2)
- asp.net控件开发基础(5)
- asp.net控件开发基础(13)
- asp.net控件开发基础(18)
- asp.net控件开发基础(10)
- asp.net控件开发基础九
- asp.net控件开发基础(1)
- asp.net控件开发基础十