快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21
两个抽象方法PerformSelect和ValidateDataSource由子类实现.

虽然你不需要对这两个类的实现了解很多,但你需要知道两个类为你做了什么.

1.BaseDataBoundControl类大致做了如下工作

定义了基本的DataSource和DataSourceID基本属性,我们称为数据源标识

其主要提供了两种不同做法的实现机制

(1)定义了DataSource,则会验证数据源的正确性即ValidateDataSource方法(此过程由子类完成),还需要手动调用DataBind方法

(2)定义了DataSourceID,则会自动调用DataBind方法

当定义了以上其中一个属性时,这个类便帮你做了以下执行过程,所以你还需要了解以下成员

OnDataPropertyChanged方法(当定义了数据源标识或其发生变化后)

|

RequiresDataBinding方法(确定要开始调用DataBind方法)

|

EnsureDataBound方法(判断如若定义DataSourceID属性,则执行DataBind方法,所以此步骤是关键点)

|

DataBind方法(在次方法中执行了PerformSelect方法检索数据并把数据绑定到控件,此过程由子类完成)

2.DataBoundControl类开始真正的与数据源控件开始交互,请看下面主要实现

(1)GetDataSource方法(检索与数据绑定控件关联的IDataSource接口,即从DataSourceID属性属性)

|

(2)GetData方法(从数据源控件检索数据源视图,这个方法是数据的主要来源)

|

(3)PerformSelect方法(从GetData方法中检索数据,然后调用PerformDataBinding方法)

|

(4)PerformDataBinding方法(将检索到的数据绑定到控件上,此方法为空实现,留给子类实现)

注意点:如果未设置DataSourceID属性,(1)(2)步骤可以省去,从(3)开始必然会执行.

一般情况下,简单的数据绑定控件留给我们做的只剩下第4个步骤PerformDataBinding方法,你只需要重写这个方法,获取控件要呈现的数据就完成了.其他的事情就不需要你操心了.说了这么多,还是来看看示例代码吧.

四.示例

代码来自asp.net2.0揭密,我把重复的定义删除了只留下PerformDataBinding方法

1.从DataBoundControl继承

public class TextBoxSet : DataBoundControl
{
}

2.定义属性

private IList alBoxSet;
public IList BoxSet
{
   get
   {
     if (null == alBoxSet)
     {
       alBoxSet = new ArrayList();
     }
     return alBoxSet;
   }
}
public string DataTextField
{
   get
   {
     object o = ViewState["DataTextField"];
     return ((o == null) ? string.Empty : (string) o);
   }
   set
   {
     ViewState["DataTextField"] = value;
     if (Initialized)
     {
       OnDataPropertyChanged();
     }
   }
}

3.方法实现

protected override void PerformDataBinding(IEnumerable retrievedData)
{
   if (retrievedData != null)
   {
     foreach (object dataItem in retrievedData)
     {
       TextBox box = new TextBox();
       if (DataTextField.Length > 0)
       {
         box.Text = DataBinder.GetPropertyValue(dataItem,
           DataTextField, null);
       }
       else
       {
         PropertyDescriptorCollection props =
           TypeDescriptor.GetProperties(dataItem);
         box.Text = String.Empty;
         if (props.Count >= 1)
         {
           if (null != props[0].GetValue(dataItem))
           {
             box.Text = props[0].GetValue(dataItem).ToString();
           }
    

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号