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

  • 相关阅读:
    谈谈iOS开发如何写个人中心这类页面--静态tableView页面的编写
    H5活动产品设计指南基础版
    提高你的Java代码质量吧:使用valueof前必须进行校验
    最新VMware Workstation 10注册码,绝对可用!
    ORACLE 使用RMAN管理归档日志 archived log
    hdu 2072 单词数
    【早盘必读】9.13证券市场要闻(附股)
    Java程序性能优化
    CSS3媒体查询(Media Queries)
    [cocos2d-x]用CCSpriteBatchNode进行文理贴图的优化
  • 原文地址:https://www.cnblogs.com/626498301/p/1798660.html
Copyright © 2020-2023  润新知