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