asp.net Datalist模板控件开发

来源:互联网 发布:mysql重命名数据库名称 编辑:程序博客网 时间:2024/05/17 00:56
using System;using System.Collections.Generic;using System.Text;using System.Web.UI.WebControls;using System.Web.UI;using System.ComponentModel;using System.Web.UI.Design;using System.Web.UI.Design.WebControls;using System.Web.UI.HtmlControls;using System.IO;using System.Runtime.Serialization;using System.Collections;namespace KingControls{    /// <summary>    /// Author: 【夜战鹰】【专注于DotNet技术】【ChengKing(ZhengJian)】,同时参考clingboy博客,此为Datalist主控件DataListControl    /// 获得本书的更多章节:【http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx】    /// 声明: 【本链接为进阶Asp.net技术的一些文章】【转载时请保留本链接源】     /// </summary>    [Designer(typeof(DataListDesigner))]    [ParseChildren(true, "Items")]    [DefaultEvent("ItemCommand")]    [ToolboxData("<{0}:DataListControl runat=server></{0}:DataListControl>")]    public class DataListControl : CompositeControl    {        private int _editindex=-1;        public int EditIndex        {            get            {                if (ViewState["editindex"] == null)                    return _editindex;                else                  return Convert.ToInt32(ViewState["editindex"]);            }            set { ViewState["editindex"] = value; }        }        private int _isedit = -1;        public int IsEdit        {            get            {                return _isedit;            }            set { _isedit = value; }        }        /// <summary>        /// 数据集合        /// </summary>        [PersistenceMode(PersistenceMode.InnerProperty)]        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]        [Description("获取或设置分类集合")]        [Category("主控件属性")]        public DataCollection Items        {            get            {                if (ViewState["Items"] == null)                {                    return new DataCollection();                }                else                {                    return (DataCollection)ViewState["Items"];//用ViewState来保存Items数据源,否则刷新页面后找不到数据源(对!ispostback里面的绑定而言)                }            }            set { ViewState["Items"] = value; }        }        [PersistenceMode(PersistenceMode.InnerProperty)]        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]        [Description("获取或设置字控件")]        [Category("主控件属性")]        public System.Collections.Hashtable RepeatItems        {            get            {                if (_repeatitems == null)                {                    return new System.Collections.Hashtable();                }                else                {                    return _repeatitems;                }            }            set { _repeatitems = value; }        }        private Hashtable _repeatitems;        private ITemplate itemTemplate;        [Browsable(false)]        [TemplateContainer(typeof(RepeateItem))]        [PersistenceMode(PersistenceMode.InnerProperty)]        public virtual ITemplate ItemTemplate        {            get { return itemTemplate; }            set             {                itemTemplate = value;                base.ChildControlsCreated = false;             }        }        private ITemplate editTemplate;        [Browsable(false)]        [TemplateContainer(typeof(RepeateItem),BindingDirection.TwoWay)]        [PersistenceMode(PersistenceMode.InnerProperty)]        public virtual ITemplate EditTemplate        {            get { return editTemplate; }            set            {                editTemplate = value;                base.ChildControlsCreated = false;            }        }        private ITemplate headerTemplate;        [Browsable(false)]        [TemplateContainer(typeof(RepeateItem))]        [PersistenceMode(PersistenceMode.InnerProperty)]        public virtual ITemplate HeaderTemplate        {            get { return headerTemplate; }            set            {                headerTemplate = value;                base.ChildControlsCreated = false;            }        }        private ITemplate footerTemplate;        [Browsable(false)]        [TemplateContainer(typeof(RepeateItem))]        [PersistenceMode(PersistenceMode.InnerProperty)]        public virtual ITemplate FooterTemplate        {            get { return footerTemplate; }            set            {                footerTemplate = value;                base.ChildControlsCreated = false;            }        }        [Category("主控件属性")]        [DefaultValue("")]        [Localizable(true)]        public int Cols        {            get            {                object o = (object)ViewState["Cols"];                return (o != null) ? (int)o : 5;            }            set            {                ViewState["Cols"] = value;            }        }        [Description("资源(image/css/js)的客户端根目录")]        public string ClientPath        {            get            {                string p = (string)ViewState["ClientPath"];                return ((p == null) ? String.Empty : p);            }            set            {                ViewState["ClientPath"] = value;            }        }        protected override HtmlTextWriterTag TagKey        {            get            {                return HtmlTextWriterTag.Div;            }        }        private static readonly object EventItemCreated = new object();                public event RepeateItemEventHandler ItemCreated        {            add            {                base.Events.AddHandler(EventItemCreated, value);            }            remove            {                base.Events.RemoveHandler(EventItemCreated, value);            }        }                        private static readonly object EventItemDataBound = new object();        public event RepeateItemEventHandler ItemDataBound        {            add            {                base.Events.AddHandler(EventItemDataBound, value);            }            remove            {                base.Events.RemoveHandler(EventItemDataBound, value);            }        }        private Button btnSearch;        protected override void OnPreRender(EventArgs e)        {            string strControlCSS = base.ResolveUrl(Path.Combine(this.ClientPath, @"CSS\DataListControl.css"));            if (Page.Header != null)            {                HtmlLink link = new HtmlLink();                link.Href = strControlCSS;                link.Attributes.Add("type", "text/css");                link.Attributes.Add("rel", "stylesheet");                Page.Header.Controls.Add(link);            }            base.OnPreRender(e);        }        public  void Bind()        {            CreateChildControls();        }        Hashtable tt = null;        protected override void CreateChildControls()        {            HtmlTable table = new HtmlTable();            tt = new Hashtable();            table.Attributes["class"] = "DataListControl_table";            if (this.HeaderTemplate != null)            {                HtmlTableRow row = new HtmlTableRow();                table.Rows.Add(row);                row.Attributes["class"] = "DataListControl_tr";                HtmlTableCell cell = new HtmlTableCell();                row.Cells.Add(cell);                cell.ColSpan = this.Cols;                cell.Attributes["class"] = "DataListControl_td";                this.CreateItem(-1,-1, ItemType.Header, null, cell);            }            if (this.ItemTemplate != null && this.Items.Count > 0)            {                //仅用于RepeateItem                int itemIndex = 0;                //增加 ItemTemplate                                int rows = this.Items.Count / this.Cols;                if (this.Items.Count / this.Cols != 0 || this.Items.Count < this.Cols)                {                    rows = rows + 1;                }                for (int i = 0; i < rows; i++)                {                    HtmlTableRow row = new HtmlTableRow();                    table.Rows.Add(row);                    row.Attributes["class"] = "DataListControl_tr";                    for (int j = 0; j < this.Cols; j++)                    {                        //补全当前行<td>                        if (i * this.Cols + j == this.Items.Count)                        {                            int cells = (this.Cols - j);                            HtmlTableCell cell2 = new HtmlTableCell();                            row.Cells.Add(cell2);                            cell2.ColSpan = cells;                            cell2.Attributes["class"] = "DataListControl_td";                            break;                        }                        HtmlTableCell cell = new HtmlTableCell();                                                row.Cells.Add(cell);                        cell.ColSpan = this.Cols;                        cell.Attributes["class"] = "DataListControl_td";                        if (EditIndex == itemIndex)//判断是否为编辑列,如果是,则实例化编辑模板                        {                            this.CreateItem(i, itemIndex, ItemType.Edit, this.Items[i * this.Cols + j], cell);                        }                        else                        {                            this.CreateItem(i, itemIndex, ItemType.Item, this.Items[i * this.Cols + j], cell);                        }                        itemIndex++;                    }                }                                                         }            if (this.footerTemplate != null)            {                HtmlTableRow row = new HtmlTableRow();                table.Rows.Add(row);                row.Attributes["class"] = "DataListControl_tr";                HtmlTableCell cell = new HtmlTableCell();                row.Cells.Add(cell);                cell.ColSpan = this.Cols;                cell.Attributes["class"] = "DataListControl_td";                this.CreateItem(-1,-1, ItemType.Footer, null, cell);            }            this.Controls.Clear();            RepeatItems = tt;            this.Controls.Add(table);            ChildControlsCreated = true;//要事件编辑事件,必须是子控件每次都创建,否侧页面查找事件找不到所对应的控件,将无法触发编辑事件        }        private RepeateItem CreateItem(int rowIndex, int itemIndex, ItemType itemType, object dataItem, HtmlTableCell cell)        {            RepeateItem item = new RepeateItem(itemIndex, itemType, rowIndex);//作为中间模板控件            item.DataItem = dataItem;            RepeateItemEventArgs e = new RepeateItemEventArgs(item);            this.InstantiateInItem(item);//相当于手动给控件执行绑定事件            this.OnItemCreated(e);            cell.Controls.Add(item);            item.DataBind();//绑定数据            this.OnItemDataBound(e);//执行页面绑定事件,在此事件中可以获取上面定义的RepeateItemEventArgs,也就是中间控件RepeatItem中的所有属性,例如通过e.DataItem来获取数据            return item;        }        protected virtual void InstantiateInItem(RepeateItem item)        {            ITemplate itemTemplate = null;            switch (item.ItemType)            {                case ItemType.Header:                    itemTemplate = this.HeaderTemplate;                    break;                case ItemType.Footer:                    itemTemplate = this.FooterTemplate;                    break;                case ItemType.Item:                    itemTemplate = this.ItemTemplate;                    break;                     case ItemType.Item_Default:                    itemTemplate = new ItemDefaultTemplate();//当没有数据时,实例化默认的模板                    break;                case ItemType.Edit:                    itemTemplate = this.editTemplate;//实例化编辑模板                    break;            }                        if (itemTemplate != null)            {                itemTemplate.InstantiateIn(item);            }        }        protected virtual void OnItemCreated(RepeateItemEventArgs e)        {            RepeateItemEventHandler handler = (RepeateItemEventHandler)base.Events[EventItemCreated];            if (handler != null)            {                handler(this, e);            }        }        protected virtual void OnItemDataBound(RepeateItemEventArgs e)        {            RepeateItemEventHandler handler = (RepeateItemEventHandler)base.Events[EventItemDataBound];            if (handler != null)            {                handler(this, e);            }        }        private static readonly object ItemCommandObject = new object();        public event ItemCommandEventHandler ItemCommand        {            add            {                base.Events.AddHandler(ItemCommandObject, value);            }            remove            {                base.Events.RemoveHandler(ItemCommandObject, value);            }        }        protected virtual void OnItemCommand(ItemCommandEventArgs e)        {            ItemCommandEventHandler ButtonSearchClickHandler = (ItemCommandEventHandler)Events[ItemCommandObject];            if (ButtonSearchClickHandler != null)//如果页面注册了事件,则执行页面事件            {                ButtonSearchClickHandler(this, e);            }        }        protected override bool OnBubbleEvent(object sender, EventArgs e)        {            bool handled = false;//增加此冒泡时间,来实现模板的编辑事件            if (e is ItemCommandEventArgs)            {                ItemCommandEventArgs ce = (ItemCommandEventArgs)e;                if (ce.CommandName == "Edit" ||ce.CommandName == "Update")                {                    OnItemCommand(ce);//在编辑事件中传递自定义参数                    handled = true;                }            }            return handled;        }    }    public delegate void ItemCommandEventHandler(object sender, ItemCommandEventArgs e);    public class ItemCommandEventArgs : CommandEventArgs//在编辑事件中使用自定义参数    {        public ItemCommandEventArgs(RepeateItem item, object commandSource, CommandEventArgs originalArgs,int editindexs)            : base(originalArgs)        {            this.ritem = item;            this.commandSource = commandSource;            this.editindex = editindexs;        }        private object commandSource;        public object CommandSource        {            get            {                return commandSource;            }        }        private int editindex;        /// <summary>        ///  要搜索的关键字        /// </summary>        public int EditIndex        {            get { return editindex; }            set { editindex = value; }        }        private RepeateItem ritem;        public RepeateItem RItem        {            get { return ritem; }            set { ritem = value; }        }    }}
控件及实例下载:http://download.csdn.net/detail/haibin_hu/5392667
原创粉丝点击