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

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