创建数据绑定模板控件 Asp.net

 这是我很久以前翻译的,做为我博客园的第一篇文章发一下。
 
这次是对 Creating Data Bound Templated Control (原文)的翻译

Download Source Code (代码下载)

 

 

创建一个像Gridview一样可以绑定数据的控件,以此提高开发效率.

 

简介

      数据绑定控件在开发人员中是最流行的,因为他们都很直接. 而像Gridview和DataList的流行不是因为他们的丰富功能,而是因为他们都允许更多的个性化.用在此处的模板,可以提供很好的定制外观和感受.

当然模板概念也可以用于更广的自定义控件 .而你也可以用模板的方式把你的数据展现给用户.下面图解的方式讲述如何去做.

数据绑定和模板

     确切的讲模板控件不必总是绑定数据, 但无论怎样,现实世界案例中,更多的是数据驱动表现层.因此,还是有必要去关注学习如何让模板控件绑定数据的. 这就意味着你可以在你的控件里使用流行的 Eval()Bind()这样的数据绑定表达式.

 

    接下来要开发一个数据绑定模板控件需要你的自定义控件继承CompositeDataBoundControl 这个基类.CompositeDataBoundControl 是所有二维数据绑定控件的的基类(比如GridView).继承CompositeDataBoundControl 必须 覆盖CreateChildControls(IEnumerable, Boolean)这个方法用以创建控件层.单独子控件需要引用Controls命名空间.

 

实例

    接下来 我们创建一个模板控件 ,首先建立一个站点,并在App_Code内创建一个新类

 

---------------

namespace BinaryIntellect

{

   public class MyTemplatedControl:CompositeDataBoundControl

   {

-------------------

MyTemplatedControl 就是我们的新模板主控件

接下来我们创建一个新类

---------------

public class TemplateItem:Control,IDataItemContainer

{

---------------

这个类,继承自Control 类 和实现了 接口IDataItemContainer

他将在模板控件里独立表现数据集

IDataItemContainer 接口将促使这个类可以实现3个属性.(DataItem, DataItemIndex and DisplayIndex)

先要在这个类里声明一些需要的变量

-------------------

private object _DataItem;

private int _DataItemIndex;

private int _DisplayIndex;

------------------

_DataItem 是object 表示 可以接收单独的数据集 比如DataRow 等...那就是用来跟模板控件绑定的.

DataItemIndex表示数据源里数据集的索引 而_DisplayIndex 是用于在模板控件里显示定位索引的.记住,它可以作为数据源中的第100个定位. 因为像和模块控件里排序,分页的显示出来的索引Id.

这里要把3个变量包装到只读属性里

----------------

public object DataItem 

get { return _DataItem; } 

 

public int DataItemIndex 

get { return _DataItemIndex; } 

 

public int DisplayIndex 

get { return _DisplayIndex; } 

}        

 

--------------

接下来我们要在构造函数里接受这3个变量的值

----------------

public TemplateItem(object dataItem, int index)

{

_DataItem = dataItem;           

_DataItemIndex = _DisplayIndex = index;          

}

-----------------

注意的是我们的例子不会具体使用DisplayIndex这个属性.

 

现在我们打开原来我们创建的模板控件声明下面的属性

----

private ITemplate _itemtemplate;

[TemplateContainer(typeof(TemplateItem))]

public ITemplate MyItemTemplate

{

get { return _itemtemplate; }

set { _itemtemplate = value; }

}

 

----

这里我们 声明了ITemplate类型的一个变量 ,这个变量用MyItemTemplate 属性进行包装.

MyItemTemplate被声明为我们自定义控件里的一个模板

这里嵌入的控件类似于Gridview里的ItemTemplate 控件一样..而我们在这里定义了名为MyItemTemplate 的控件. 

注意MyItemTemplate 控件使用 Attribute TemplateContainer 装饰了的.Attribute TemplateContainer 是用来指定 一个类可以与数据集进行绑定行为.

 

接下来我们覆盖CreateChildControls() 方法.

--------------------

protected override int CreateChildControls 

(System.Collections.IEnumerable dataSource,  

bool dataBinding) 

int index=0; 

if (dataBinding) 

foreach (object dataItem in dataSource) 

if (_itemtemplate != null) 

TemplateItem container = new  

TemplateItem(dataItem, index); 

_itemtemplate.InstantiateIn(container); 

Controls.Add(container); 

index++; 

container.DataBind(); 

return index; 

}

--------------------

CreateChildControls 接受了2个参数,一个是数据源 还有一个是用来判断是否进行数据绑定操作的布尔值.

 

在这里,我们要反复穿梭于数据源中.在每一次的重复中我们都会创建TemplateItem 对象的实例. 

记住这些数据源将被来自Web或来自模板中可以作为数据源提供的数据集的每一个元素.

然后,我调用ITemplate 中的InstantiateIn() 方法,具体说就是模板中的控件用来接受像container这样的TemplateItem对象.

 

最后DataBind() 对象将会被TemplateItem 对象调用.

注意的是index 只是简单的保持对数据集索引的跟踪.并在CreateChildControls()中返回.

 

到此我们圆满的创建完毕了一个自定义的控件 .我们会用到WebFrom上,我们会把他跟Employee对象的集合进行绑定.

Employee类如下

---------------------

  public class Employee

   {

       public Employee(string fname, string lname)

       {

           _firstname = fname;

           _lastname = lname;

       }

       private string _firstname;

       public string FirstName

       {

           get { return _firstname; }

           set { _firstname = value; }

       }

       private string _lastname;

       public string LastName

       {

           get { return _lastname; }

           set { _lastname = value; }

       }

   }

-------------------

 

在这里我们定义了2个简单的属性即FirstName LastName ,我们用构造函数对这2个属性进行了初始化.

 

下面我们打开webform 并添加Register指令声明

-----

<%@ Register 

Namespace="BinaryIntellect" 

TagPrefix="cc1" %>

 

 

--------------

接下来声明MyTemplatedControl 的实例

-------

 

  <cc1:MyTemplatedControl runat="server" ID="control1">

       <MyItemTemplate>

           <h1>

           <%# Eval("FirstName") %>

           <%# Eval("LastName") %>

           </h1>

       </MyItemTemplate>

   </cc1:MyTemplatedControl>

-------

注意 <MyItemTemplate> 标签 是因为我们在MyTemplatedControl 控件里创建了MyItemTemplate 属性并且是一个ITemplate类型

在此我们的控件继承了CompositeDataBoundControl类 因此我们可以在我们的模板里使用像Eval() 这样的表达式.

,而后我们要在Page_Load事件处理里定义模板

---------------------

  protected void Page_Load(object sender, EventArgs e)

   {

       List<Employee> data = new List<Employee>();

       Employee e1 = new Employee("Nancy", "Davalio");

       Employee e2 = new Employee("Andrew", "Fuller");

       data.Add(e1);

       data.Add(e2);

       control1.DataSource = data;

       control1.DataBind();

   }

 

 

----------------------

 

这里我们创建了Employee对象集合并于控件进行了数据绑定

运行代码我们会看到如下截图

 500){this.resized=true;this.style.width=500;}" border=0>

 

Download Source Code

 

Posted On :

05 Mar 2008

作者简介:

Bipin Joshi

Bipin Joshi is the proprietor of  BinaryIntellect Consulting  where he conducts premier training programs on .NET technologies. He wears many hats including  software consultant, mentor, prolific author, webmaster, Microsoft MVP and member of ASPInsiders . Having adopted Yoga way of life Bipin also teaches  Kriya Yoga  to the interested individuals. His detailed profile can be read at his  blog . He can also be reached there.

posted @ 2008-04-18 16:19  rocklau  阅读(699)  评论(0编辑  收藏  举报