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

  • 相关阅读:
    PTA天梯赛L2
    图论-最短路算法
    配置自己的sublime
    testNG常用用法总结
    testng.xml文件的配置
    阿里云服务器 ECS Jenkins 安装教程
    jenkins报错:Problem accessing /jenkins/. Reason: HTTP ERROR 404
    jenkins安装详细教程
    jenkins下载插件无插件显示+离线下载插件方法
    如何让junit的测试跑多次
  • 原文地址:https://www.cnblogs.com/626498301/p/1798660.html
Copyright © 2011-2022 走看看