自定义控件的构建(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揭秘》

posted @ 2010-08-11 08:20  ringgo  阅读(530)  评论(0编辑  收藏  举报