在ASP.NET中与数据打交道接触最多的可能就是各类数据源控件了,这篇在前面的基础上构建一个模板化的数据绑定控件
数据绑定控件
我们现在创建一个继承CompositeDataBoundControl的控件,其可以在
和前面的内容一样,我们首先实现一个实现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=""
SelectCommand="SELECT [id], [assetCode] FROM [assetInfo]">
asp:SqlDataSource>
div>
这些标签还是很熟悉的..
看看效果吧:)
本文参考了《ASP.NET 揭秘 卷2》
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25284529/viewspace-684579/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25284529/viewspace-684579/