自定义控件的构建(12)
前面讲了模板的构建,我们忽略了一个细节,如果接触ASP.NET时间不长的话,一般都会看到数据表达式是<%#Eval(‘Name’)%>这种形式的,
那么我们为什么用<%#Container.Name%>这种形式呢,其实前者是ASP.NET控件所支持的一种简化写法,如果在自定义控件中支持简化写法,
需要实现IDataItemContainer接口 ,该接口包含3个需要实现的属性
DataItem:返回数据项的值
DataItemIndex:返回数据项在数据源中的索引
DisplayIndex:返回数据项在控件中的索引
简化的数据绑定语句
那么创建数据绑定控件时实现IDataItemContainer可以将数据库表中每条记录封装到实现这个控件的对象中,这样就实现了简化的数据表达式引用了
看个简单的例子:
先声明一个非数据绑定控件
/// <summary>
/// 简单绑定
/// </summary>
public class SingleBindingsControl:CompositeControl{private ITemplate _itemplete;
private Items _item;
public string Name{get
{EnsureChildControls();return _item.Name;
}set
{EnsureChildControls();_item.Name = value;
}}public Decimal Price
{get
{EnsureChildControls();return _item.Price;
}set
{EnsureChildControls();_item.Price= value;
}}[TemplateContainer(typeof(Items))]
[PersistenceMode(PersistenceMode.InnerProperty)]public ITemplate ItemTemplete
{get
{return _itemplete;
}set
{_itemplete = value;
}}protected override void CreateChildControls(){_item = new Items();
_itemplete.InstantiateIn(_item);this.Controls.Add(_item);
}}
这里声明的SingleBindingsControl控件通过一个ItemTempleate关联到Items类,在CreateChildControls()中,
ItemTempleate实例化到Items类中。
Items的实现
public class Items : WebControl, IDataItemContainer{public string Name { get; set; }public decimal Price { get; set; }public object DataItem { get { return this; } }public int DataItemIndex { get { return 0; } }public int DisplayIndex { get { return 0; } }}
Items类实现了IDataItemContainer类,简单的实现其中的内容而已
看看其使用,很熟悉的方式
<custom:SingleBindingsControl ID="SingleBindings1" runat="server"><ItemTemplete><%#Eval("Name") %><%#Eval("Price","{0:c}") %></ItemTemplete></custom:SingleBindingsControl></div>
添加一数据
this.SingleBindings1.Name = "Hello ,asp.net";this.SingleBindings1.Price = 123.12M;
this.DataBind();
OK,一直用Eval()的朋友知道Eval的是怎么出来的了吧。。。
本文参《ASP.NET 3.5揭秘》