zoukankan      html  css  js  c++  java
  • 自定义控件的构建(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揭秘》

  • 相关阅读:
    Netbeans 注释模板配置
    你可能不知道的5 个强大的HTML5 API 函数
    科幻大片中那些牛X代码真相
    怎么才能成为一名PHP专家?
    网页设计中常见的错误列举
    五个必须警惕的数据库设计错误
    五种情况会导致Session 丢失
    四种策略防止用户将表单重复提交
    jQuery的deferred对象使用笔记
    [Web前端]由cookies安全说开去
  • 原文地址:https://www.cnblogs.com/626498301/p/1797047.html
Copyright © 2011-2022 走看看