自定义控件的构建(14)
在ASP.NET中与数据打交道接触最多的可能就是各类数据源控件了,这篇在前面的基础上构建一个模板化的数据绑定控件
数据绑定控件
我们现在创建一个继承CompositeDataBoundControl的控件,其可以在<DIV>中显示一批数据项
和前面的内容一样,我们首先实现一个实现IDataItemContainer的控件
public class ViewItems : WebControl, IDataItemContainer{private object _dataItem;private int _index;public object DataItem{get { return _dataItem; }}public int DataItemIndex{get { return _index; }}public int DisplayIndex{get { return _index; }}protected override HtmlTextWriterTag TagKey{get
{return HtmlTextWriterTag.Div;
}}public ViewItems(object dataItem,int index){_index = index;_dataItem = dataItem;}}
然后创建包含其为子项的控件
public class BlockView: CompositeDataBoundControl{private ITemplate _itemTemplet;
[TemplateContainer(typeof(ViewItems))]
[PersistenceMode(PersistenceMode.InnerProperty)]public ITemplate ItemTemplet
{get { return _itemTemplet; }set { _itemTemplet = value; }}protected override HtmlTextWriterTag TagKey{get
{return HtmlTextWriterTag.Div;
}}protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding){int counter = 0;
foreach (object dataItem in dataSource){ViewItems items = new ViewItems(dataItem, counter);
_itemTemplet.InstantiateIn(items);Controls.Add(items);counter++;}DataBind(false);
return counter;
}}
这里的BlockView支持格式化数据项的ItemTemplate,而且使用该控件的时候,必须提供ItemTemplate
这里的CreateChildControls()与前面几篇中的同名函数是不一样的,这里重写的是CompositeDataBoundControl的方法
该方法包含2个参数:datasource:表示数据源中的所有数据项
dataBinding:表示从数据源中检索数据项时是否调用了CreateChildControls()
事实上,BlockView每次生成其数据项,都会调用CreateChildControls(),当其第一次绑定到数据源中时,参数datasource会在数据源控件中取得数据项。
上面的代码要注意的是DataBind(),因为其要在子控件创建了之后才会被调用,若控件中包含了数据绑定表达式,在必须调用DataBind()
下面演示一下其用法:
稍微控制一下样式
.block {width:500px;}.block div{border:solid 1px black;padding:10px;margin:10px;}
页面:
<div><customer:BlockView ID="BlockView1" CssClass="block" runat="server"DataSourceID="SqlDataSource1"><ItemTemplet><%#Eval("id") %><%#Eval("assetCode")%></ItemTemplet></customer:BlockView><asp:SqlDataSource ID="SqlDataSource1" runat="server"ConnectionString="<%$ ConnectionStrings:JSSP_OAConnectionString %>"SelectCommand="SELECT [id], [assetCode] FROM [assetInfo]"></asp:SqlDataSource></div>
这些标签还是很熟悉的..
看看效果吧:)
本文参考了《ASP.NET 揭秘 卷2》