最近做project需要用到类似XPPanel的管理菜单,找了N久也没找到比较合适的,于是乎自己动手,丰衣足食,写了个控件,记录下来以做资料 Link.cs using System; using System.Collections; using System.Collections.Generic; using System.Text; namespace NetSharp.WebControl.Explore ... { /**//// <summary> /// Summary description for Link /// </summary> public class Link ...{ constructor#region constructor /**//// <summary> /// 默认构造函数 /// </summary> /// <param name="linkGroupID"></param> /// <param name="text"></param> /// <param name="linkImage"></param> /// <param name="linkUrl"></param> /// <param name="target"></param> public Link(int linkGroupID, string text, string linkImage) ...{ this._linkGrupID = linkGroupID; this._text = text; this._linkImage = linkImage; } // End of Link /**//// <summary> /// 默认构造函数 /// </summary> /// <param name="linkGroupID"></param> /// <param name="text"></param> /// <param name="linkImage"></param> /// <param name="linkUrl"></param> /// <param name="target"></param> public Link(int linkGroupID, string text, string linkImage, string linkUrl) ...{ this._linkGrupID = linkGroupID; this._text = text; this._linkImage = linkImage; this._linkUrl = linkUrl; } // End of Link /**//// <summary> /// 默认构造函数 /// </summary> /// <param name="linkGroupID"></param> /// <param name="text"></param> /// <param name="linkImage"></param> /// <param name="linkUrl"></param> /// <param name="target"></param> public Link(int linkGroupID, string text, string linkImage, string linkUrl, string target) ...{ this._linkGrupID = linkGroupID; this._text = text; this._linkImage = linkImage; this._linkUrl = linkUrl; this._target = target; } // End of Link #endregion private properties#region private properties /**//// <summary> /// LinkGroup的唯一ID /// </summary> private int _linkGrupID; private string _text = string.Empty; private string _linkImage = string.Empty; private string _linkUrl = ""; private string _target = "main"; #endregion public properties#region public properties /**//// <summary> /// LinkGroup的唯一ID /// </summary> public int LinkGroupID ...{ get ...{ return _linkGrupID; } set ...{ _linkGrupID = value; } } /**//// <summary> /// 要显示的字符串 /// </summary> public string Text ...{ get ...{ return _text; } set ...{ _text = value; } } /**//// <summary> /// 要显示在链接左边的小图片 /// </summary> public string LinkImage ...{ get ...{ return _linkImage; } set ...{ _linkImage = value; } } /**//// <summary> /// 链接的Url地址 /// </summary> public string LinkUrl ...{ get ...{ return _linkUrl; } set...{_linkUrl = value;} } /**//// <summary> /// 链接打开目标窗口名称 /// </summary> public string Target ...{ get ...{ return _target; } set ...{ _target = value; } } #endregion } /**//// <summary> /// Collection Class of Link_Collection /// </summary> public class Link_Collection : ArrayList ...{ /**//// <summary> /// adds an item /// </summary> /// <param name="item">an object of Colour class</param> public void Add(Link item) ...{ base.Add(item); } //End of Add /**//// <summary> /// returns data according to given index /// </summary> public new Link this[int nIndex] ...{ get ...{ return (Link)base[nIndex]; } } } //End of class Link_Collection} LinKGroup.cs using System; using System.Collections.Generic; using System.Collections; using System.Text; using System.Threading; namespace NetSharp.WebControl.Explore ... { /**//// <summary> /// XPPanel单个分组 /// </summary> public class LinkGroup ...{ constrctor#region constrctor /**//// <summary> /// Constrctor /// </summary> public LinkGroup()...{} // End of LinkGroup /**//// <summary> /// Constrctor /// </summary> /// <param name="groupName">groupName</param> public LinkGroup(string groupName) ...{ this._groupName = groupName; } // End of LinkGroup #endregion private properties#region private properties /**//// <summary> /// 分组唯一ID,由系统自动产生 /// </summary> private int _groupID = 0; /**//// <summary> /// 链接集合 /// </summary> private Link_Collection _linkList = new Link_Collection(); /**//// <summary> /// XPPanel分组名称 /// </summary> private string _groupName = String.Empty; /**//// <summary> /// XPPanel分组标题背景图片 /// </summary> private string _backImage = "Image/XPPanel_LinkGroup_Title_bg.gif"; /**//// <summary> /// 该分组是否展开 /// </summary> private bool _expanded = true; /**//// <summary> /// CssClassName /// </summary> private string _cssClass = string.Empty; /**//// <summary> /// 行高 /// </summary> private int _titleHeight = 25; private bool _isAlwaysExpaned = false; #endregion public properties#region public properties /**//// <summary> /// 分组唯一ID,由系统自动产生 /// </summary> public int GroupID ...{ get ...{ if (_groupID != 0) return _groupID; else ...{ DateTime currDate = DateTime.Now; System.Threading.Thread.Sleep(3); _groupID = currDate.Millisecond; return _groupID; } // End of if } set ...{ _groupID = value; } } /**//// <summary> /// 链接集合 /// </summary> public Link_Collection LinkList ...{ get ...{ return _linkList; } set ...{ _linkList = value; } } /**//// <summary> /// XPPanel分组名称 /// </summary> public string GroupName ...{ get ...{ return _groupName; } set ...{ _groupName = value; } } /**//// <summary> /// XPPanel分组标题背景图片 /// </summary> public string BackImage ...{ get ...{ return _backImage; } set ...{ _backImage = value; } } /**//// <summary> /// 该分组是否展开 /// </summary> public bool Expanded ...{ get ...{ return _expanded; } set ...{ _expanded = value; } } /**//// <summary> /// CssClassName /// </summary> public string CssClass ...{ get ...{ return _cssClass; } set ...{ _cssClass = value; } } /**//// <summary> /// 行高 /// </summary> public int TitleHeight ...{ get ...{ return _titleHeight; } set ...{ _titleHeight = value; } } /**//// <summary> /// 是否始终展开 /// </summary> public bool IsAlwaysExpaned ...{ get ...{ return _isAlwaysExpaned; } set ...{ _isAlwaysExpaned = value; } } #endregion Public methods#region Public methods public void AddLink(Link _link) ...{ this._linkList.Add(_link); } #endregion } /**//// <summary> /// Collection Class of LinkGroup_Collection /// </summary> public class LinkGroup_Collection : ArrayList ...{ /**//// <summary> /// adds an item /// </summary> /// <param name="item">an object of Colour class</param> public void Add(LinkGroup item) ...{ base.Add(item); } //End of Add /**//// <summary> /// returns data according to given index /// </summary> public new LinkGroup this[int nIndex] ...{ get ...{ return (LinkGroup)base[nIndex]; } } } //End of class LinkGroup_Collection} XPPanel1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace NetSharp.WebControl.Explore ... { [DefaultProperty("Text")] [ToolboxData("<{0}:XPPanel1 runat=server></{0}:XPPanel1>")] public class XPPanel1 : System.Web.UI.WebControls.WebControl ...{ Private properties#region Private properties private string _XMLFile = string.Empty; private int _linkItemHeight = 20; private LinkGroup_Collection _LinkGroupList = new LinkGroup_Collection(); #endregion Public properties#region Public properties [Bindable(true)] [Category("Appearance")] [DefaultValue("")] [Description("The name of the XML file to be used")] [Localizable(true)] public string XMLFile ...{ get ...{ return _XMLFile; } set ...{ _XMLFile = value; } } [Category("Appearance")] [DefaultValue(20)] [Description("链接项的行高")] public int LinkItemHeight ...{ get ...{ return _linkItemHeight; } set ...{ _linkItemHeight = value; } } /**//// <summary> /// XPPanel 链接分组 /// </summary> public LinkGroup_Collection LinkGroupList ...{ get ...{ return _LinkGroupList; } set ...{ _LinkGroupList = value; } } #endregion Public methods#region Public methods /**//// <summary> /// 将现有LinkGroup添加到_LinkGroupList /// </summary> /// <param name="_linkGroup">待添加的LinkGroup</param> public void AddLinkGroup(LinkGroup _linkGroup) ...{ this._LinkGroupList.Add(_linkGroup); } // End of AddLinkGroup #endregion // 重写RenderContents方法 protected override void RenderContents(HtmlTextWriter output) ...{ // output Style Sheet output.Write(@"<STYLE type='text/css'>.sec_menu { BORDER-RIGHT: white 1px solid; BACKGROUND: #f7f7f7; PADDING-BOTTOM: 5px; OVERFLOW: hidden; BORDER-LEFT: white 1px solid; PADDING-TOP: 3px; BORDER-BOTTOM: white 1px solid}.menu_title { }.menu_title SPAN { FONT-WEIGHT: bold; LEFT: 8px; COLOR: #333333; POSITION: relative; TOP: 2px}.menu_title2 { }.menu_title2 SPAN { FONT-WEIGHT: bold; LEFT: 8px; COLOR: #cc0000; POSITION: relative; TOP: 2px}</STYLE>"); // output javascript needed output.Write(" <SCRIPT language="javascript"> "); output.Write("function showsubmenu(sid) {"); output.Write(" whichEl = eval("submenu" + sid);"); output.Write(" if (whichEl.style.display == "none") { "); output.Write(" eval("submenu" + sid + ".style.display=/"/";"); } "); output.Write(" else { "); output.Write(" eval("submenu" + sid + ".style.display=/"none/";"); } }"); output.Write("</SCRIPT> "); // output all datas foreach (LinkGroup _linkGroup in _LinkGroupList) ...{ output.Write("<!-- Group " + _linkGroup.GroupName + " Start-->"); output.Write(@" <TABLE cellSpacing=0 cellPadding=0 width='" + this.Width.ToString() + @"' align='center'> <TBODY> <!-- Group Title --> <TR>"); if(_linkGroup.IsAlwaysExpaned) ...{ //始终展开 output.Write(@" <TD class='menu_title' id='menuTitle" + _linkGroup.GroupID.ToString() + "' background='" + _linkGroup.BackImage + @"' height=" + _linkGroup.TitleHeight.ToString() + @"> <SPAN>" + _linkGroup.GroupName + @"</SPAN> </TD>"); } else ...{ output.Write(@" <TD class='menu_title' id='menuTitle" + _linkGroup.GroupID.ToString() + "' style='CURSOR: hand' οnclick=showsubmenu(" + _linkGroup.GroupID.ToString() + ") background='" + _linkGroup.BackImage + "' height=" + _linkGroup.TitleHeight.ToString() + @"> <SPAN>" + _linkGroup.GroupName + @"</SPAN> </TD>"); } // End of if if (_linkGroup.Expanded) ...{ output.Write(@" </TR> <!-- Group Title End --> <TR> <TD id='submenu" + _linkGroup.GroupID.ToString() + @"'> <DIV class='sec_menu' style='WIDTH: 158px'> <TABLE cellSpacing=0 cellPadding=0 width=130 align=center> <TBODY>"); } else ...{ output.Write(@" </TR> <!-- Group Title End --> <TR> <TD id='submenu" + _linkGroup.GroupID.ToString() + @"' style='DISPLAY: none'> <DIV class='sec_menu' style='WIDTH: 158px'> <TABLE cellSpacing=0 cellPadding=0 width=130 align=center> <TBODY>"); } // End of if // 为单个链接生成相应的html代码 foreach (Link _link in _linkGroup.LinkList) ...{ if (_link.LinkImage != string.Empty) ...{ if (0 == _link.LinkUrl.Length) ...{ // 没有链接 output.Write(@" <TR> <TD height=20><IMG height='16' src='" + _link.LinkImage + "' width='16'>" + _link.Text + "</TD></TR>"); } else output.Write(@" <TR> <TD height=20><IMG height='16' src='" + _link.LinkImage + "' width='16'><A href='" + _link.LinkUrl + "'target='" + _link.Target + "'>" + _link.Text + "</A></TD></TR>"); // End of if } else ...{ if (0 == _link.LinkUrl.Length) // 没有链接 output.Write(@" <TR> <TD height='20'> <P style='MARGIN-LEFT: 25px'>" + _link.Text + "</P></TD></TR>"); else output.Write(@" <TR> <TD height='20'> <P style='MARGIN-LEFT: 25px'><A href='" + _link.LinkUrl + "'target='" + _link.Target + "'>" + _link.Text + "</A></P></TD></TR>"); } // End of if } // End of foreach output.Write(@" </TBODY> </TABLE> </DIV> <DIV style='WIDTH: " + this.Width.ToString() + @"px'> <TABLE cellSpacing='0' cellPadding='0' width='130' align=center> <TBODY> <TR><TD height=20></TD></TR> </TBODY> </TABLE> </DIV> </TD> </TR></TBODY></TABLE>"); } // End of foreach } // End of RenderContents } // End of class XPPanel1}