本文示例源代码或素材下载
其实这个控件的核心基本都在JS上,而相关的数据绑定和显示却非常简单。而需要说明的是在Discuz!NT的1.0和2.0正式版,这个控件做过一些调整,当然改动也基本上是在JS上,今天给大家的源码是1.0正式版的代码,虽然有些“旧”,但程序本身的思想没变,大家只要明白了这里的源码,有了这碗酒垫底,相信再看即将开源的2.0代码,就会一目了然了。
好了,废话到此,马上开始今天的话题!
先请大家看一下这个控件运行时的效果图:
效果图1:
效果图2:
首先将相应的C#代码放出来:
1Property ScriptPath#region Property ScriptPath
2
3 /**//// <summary>
4 /// Javascript脚本文件所在目录。
5 /// </summary>
6 [Description("Javascript脚本文件所在目录。"),DefaultValue("./")]
7 public string ScriptPath
8 {
9 get
10 {
11 object obj = ViewState["NavMenuScriptPath"];
12 return obj == null ? "js/Navbar.js" :(string) obj;
13 }
14 set
15 {
16 ViewState["NavMenuScriptPath"] = value;
17 }
18 }
19
20 #endregion
21
22
23 Property ImageUrl#region Property ImageUrl
24 [Bindable(true), Category("Appearance"), DefaultValue("")]
25 public string ImageUrl
26 {
27 get
28 {
29 if (base.ViewState["NavMenuimageurl"] != null)
30 {
31 return (String)base.ViewState["NavMenuimageurl"];
32 }
33 else
34 {
35 return "images/";//String.Empty;
36 }
37 }
38 set
39 {
40 base.ViewState["NavMenuimageurl"] = value;
41 }
42 }
43
44 #endregion
45
46
47 Property CssPath#region Property CssPath
48
49 /**//// <summary>
50 /// Css文件所在目录。
51 /// </summary>
52 [Description("Javascript脚本文件所在目录。"),DefaultValue("./")]
53 public string CssPath
54 {
55 get
56 {
57 object obj = ViewState["NavMenuCssPath"];
58 return obj == null ? "styles/nav.css" :(string) obj;
59 }
60 set
61 {
62 ViewState["NavMenuCssPath"] = value;
63 }
64 }
65
66 #endregion
67
68
69 Property XmlFileFullPathName#region Property XmlFileFullPathName
70
71 /**//// <summary>
72 /// Xml文件所在目录。
73 /// </summary>
74 [Description("Xml文件所在目录。"),DefaultValue("./")]
75 public string XmlFileFullPathName
76 {
77 get
78 {
79 object obj = ViewState["NavMenuXmlFileFullPathName"];
80 return obj == null ? "xml/navmenu.xml" :(string) obj;
81 }
82 set
83 {
84 ViewState["NavMenuXmlFileFullPathName"] = value;
85 }
86 }
87
88 #endregion
89
90 protected override void OnPreRender(EventArgs e)#region protected override void OnPreRender(EventArgs e)
91 /**//// <summary>
92 /// 重写<see cref="System.Web.UI.Control.OnPreRender"/>方法。
93 /// </summary>
94 /// <param name="e">包含事件数据的 <see cref="EventArgs"/> 对象。</param>
95 protected override void OnPreRender(EventArgs e)
96 {
97 StringBuilder sb = new StringBuilder();
98
99 sb.Append("<script type="text/javascript" src=http://tech.ddvip.com/2008-10/"" + this.ScriptPath + ""></script>rn");
100 sb.Append("<link rel="styles heet" type="text/css" href=http://tech.ddvip.com/2008-10/"" + this.CssPath + "" />rn");
101 sb.Append("<script type="text/javascript">var imgpath='" + this.ImageUrl + "';</script>rn");
102 sb.Append("<script language="javascript" src=http://tech.ddvip.com/2008-10/"" + this.ScriptPath + ""></script>rn");
103#if NET1
104 if (!Page.IsClientScriptBlockRegistered("NavMenu"))
105 {
106 Page.RegisterClientScriptBlock("NavMenu", sb.ToString());
107 }
108#else
109 if (!Page.ClientScript.IsClientScriptBlockRegistered("NavMenu"))
110 {
111 Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "NavMenu", sb.ToString());
112 }
113#endif
114
115 base.OnPreRender(e);
116 }
117
118 #endregion
119
120 /**//// <summary>
121 /// 将此控件呈现给指定的输出参数。
122 /// </summary>
123 /// <param name="output"> 要写出到的 HTML 编写器 </param>
124 protected override void Render(HtmlTextWriter output)
125 {
126
127 output.Write("<div class="sdmenu">rn");
128
129 System.Data.DataSet dsSrc = new System.Data.DataSet();
130 dsSrc.ReadXml(Page.Server.MapPath(this.XmlFileFullPathName));
131
132 int count=0;
133 foreach(System.Data.DataRow dr in dsSrc.Tables[0].Rows)
134 {
135 输出主菜单#region 输出主菜单
136 output.Write(" <table>rn");
137 output.Write("<tr>rn");
138 if(count==0)
139 {
140 output.Write("<td width="196px"><span class="title" id="top">"+
141 dr["menutitle"]+"</span></td>rn");
142 }
143 else
144 {
145 output.Write("<td width="196px"><span class="title">"+
146 dr["menutitle"]+"</span></td>rn");
147 }
148 output.Write("<td><img src=http://tech.ddvip.com/2008-10/""+this.ImageUrl+"/top_level_ico1.gif"
149 class="arrow" /></td>rn");
150 output.Write("</tr>rn");
151 output.Write("</table>rn");
152 #endregion
153
154 输出子菜单#region 输出子菜单
155 output.Write(" <div class="submenu">rn");
156 output.Write("<table>rn");
157 foreach(System.Data.DataRow drs in dsSrc.Tables[1].Select("menuparentid=http://tech.ddvip.com/2008-10/'"+
158 dr["menuid"]+"'"))
159 {
160
161 output.Write("<tr>rn");
162 if(drs["imgurl"].ToString().Trim()!="")
163 {
164 output.Write(" <td class="lefttd" ><img src=http://tech.ddvip.com/2008-10/""+
165 drs["imgurl"].ToString().Trim()+""
166 class="submenuimg" align="absmiddle"/></td>");
167 }
168 else
169 {
170 output.Write(" <td class="lefttd" ></td>");
171 }
172 if((drs["frameid"].ToString().Trim()=="top")
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!