这是我很久以前翻译的,做为我博客园的第一篇文章发一下。
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>
作者简介:
|
转载于:https://www.cnblogs.com/rocklau/archive/2008/04/18/1160101.html