本文介绍的菜单控件采用的css 和ul list来显示菜单,生成的html小,无需javascript支持,对大部分的浏览器都支持,除ie6要单独修改css也可以使其支持。
通过本文可以了解asp.net 控件的开发,及Composite设计模式的实际运用。
采用Composite设计模式设计菜单类:

MenuCompositeitem类

复制代码
代码如下:
namespace Ruinet.Controls
{

[Serializable()]
public class MenuCompositeItem
{
private
List<MenuCompositeItem> _children = new List<MenuCompositeItem>();

private string _text;
private string _link;
private string _target;

/// <summary>
/// 菜单项
/// </summary>
/// <param
name="text">菜单名</param>
/// <param
name="link">链接</param>
public MenuCompositeItem(string text, string
link)
{
this._text = text;
this._link = link;
}
///
<summary>
/// 菜单项
/// </summary>
/// <param
name="text">菜单名</param>
/// <param
name="link">链接</param>
/// <param
name="target">跳转目标</param>
public MenuCompositeItem(string text,
string link, string target)
{
this._text = text;
this._link = link;

this._target = target;
}
/// <summary>
/// 设置或获取菜单名

/// </summary>
public string Text
{
get { return _text; }

set { _text = value; }
}
/// <summary>
/// 设置或获取链接
///
</summary>
public string Link
{
get { return _link; }
set
{ _link = value; }
}
/// <summary>
/// 跳转目标
///
</summary>
public string Target
{
get { return _target; }

set { _target=value; }
}
/// <summary>
/// 设置或获取子菜单

/// </summary>
public List<MenuCompositeItem> Children
{

get { return _children; }
set { _children = value; }
}
}

MenuComposite类

复制代码
代码如下:
namespace Ruinet.Controls
{

[DefaultProperty("Menu")]
[ToolboxData("<{0}:MenuComposite
runat=server></{0}:MenuComposite>")]
public class MenuComposite :
WebControl
{
/// <summary>
/// 设置获取选择的菜单
///
</summary>
[Bindable(true)]
[DefaultValue("")]

[Localizable(true)]
public string SelectedMenuText
{
get
{

String s = (String)ViewState["SelectedMenuText"];
return ((s == null) ?
String.Empty : s);
}
set
{
ViewState["SelectedMenuText"] =
value;
}
}
/// <summary>
/// 获取和设置菜单项从ViewState
///
</summary>
[Bindable(true)]
[DefaultValue(null)]

[Localizable(true)]
public MenuCompositeItem MenuItems
{
get

{
return ViewState["MenuItems"] as MenuCompositeItem;
}
set

{
ViewState["MenuItems"] = value;
}
}
/// <summary>

/// 呈现菜单结构
/// </summary>
/// <param
name="output">HTML输出流</param>
protected override void
RenderContents(HtmlTextWriter output)
{
MenuCompositeItem root =
this.MenuItems;
output.Write(@"<div class=""navmenu"">");

output.Write(@" <ul>");
for (int i = 0; i <
root.Children.Count; i++)
{
RecursiveRender(output, root.Children[i]);

}
output.Write(@" </ul>");
output.Write(@"</div>");

}
/// <summary>
/// 递归输出菜单项
/// </summary>
///
<param name="output">HTML输出流</param>
/// <param
name="item">菜单项.</param>
/// <param name="depth">Indentation
depth.</param>
private void RecursiveRender(HtmlTextWriter output,
MenuCompositeItem item)
{
output.Write("<li>");
if
(string.IsNullOrEmpty(item.Target))//为空不设置跳转目标
{
output.Write(@"<a
href=""" + item.Link + @""">");
}
else
{
output.Write(@"<a
href=""" + item.Link + @""" target= """ + item.Target + @""">");
}
if
(item.Text == SelectedMenuText) //选中的菜单
{
output.Write(@"<span
class=""selected"">");
output.WriteLine(item.Text);

output.WriteLine("</span>");
}
else
{

output.Write(item.Text);
}
output.Write("</a>");
if
(item.Children.Count > 0)
{
output.WriteLine();

output.Write("<ul>");
for (int i = 0; i < item.Children.Count;
i++)
{
RecursiveRender(output, item.Children[i]);
}

output.Write("</ul>");
}
output.Write("</li>");
}

}
}

在页面中使用
添加对控件的引用后就可以直接在“工具箱”-》Controls组件中
看到MenuComposite组件
再就可以像其他asp.net 控件一样使用
使用:

复制代码
代码如下:
MenuCompositeItem root = new
MenuCompositeItem("root", null);
MenuCompositeItem menu01 = new
MenuCompositeItem("menu01", ResolveUrl("~/Default.aspx"));
MenuCompositeItem
menu02 = new MenuCompositeItem("menu02", ResolveUrl("~/Default.aspx"));

MenuCompositeItem menu03 = new MenuCompositeItem("menu03",
ResolveUrl("~/Default.aspx"));
MenuCompositeItem menu04 = new
MenuCompositeItem("menu04", ResolveUrl("~/Page04.aspx"));
MenuCompositeItem
menu05 = new MenuCompositeItem("menu05", ResolveUrl("~/Default.aspx"));

MenuCompositeItem menu01_01 = new MenuCompositeItem("menu01-01",
ResolveUrl("~/Default.aspx"));
MenuCompositeItem menu01_02 = new
MenuCompositeItem("menu01-02", ResolveUrl("~/Page01-02.aspx"));

MenuCompositeItem menu01_03 = new MenuCompositeItem("menu01-03",
ResolveUrl("~/Default.aspx"));
MenuCompositeItem menu01_04 = new
MenuCompositeItem("menu01-04", ResolveUrl("~/Default.aspx"));

menu01.Children.Add(menu01_01);
menu01.Children.Add(menu01_02);

menu01.Children.Add(menu01_03);
menu01.Children.Add(menu01_04);

MenuCompositeItem menu02_01 = new MenuCompositeItem("menu02-01",
ResolveUrl("~/Default.aspx"));
MenuCompositeItem menu02_02 = new
MenuCompositeItem("menu02-02", ResolveUrl("~/Default.aspx"), "menu02-02");

menu02.Children.Add(menu02_01);
menu02.Children.Add(menu02_02);

MenuCompositeItem menu04_01 = new MenuCompositeItem("menu04-01",
ResolveUrl("~/Default.aspx"));
MenuCompositeItem menu04_02 = new
MenuCompositeItem("menu04-02", ResolveUrl("~/Page04-02.aspx"), "_blank");

menu04.Children.Add(menu04_01);
menu04.Children.Add(menu04_02);

root.Children.Add(menu01);
root.Children.Add(menu02);

root.Children.Add(menu03);
root.Children.Add(menu04);

root.Children.Add(menu05);

TheMenuComposite.MenuItems = root;

此时生成的编译运行后会生成一个没有样式Ul list ,效果如下:
  
因此要生成可显示和隐藏的菜单项,关键在css的设置上,开始时将二级子菜单设置为隐藏visibility:
hidden;
同时定义li的hover事件,li:hover时:自菜单的 visibility要改为visible;
大致原理是这样,当然还有注意菜单项的位置
一级菜单float:left;使其能水平显示。
CSS定义如下:

复制代码
代码如下:
.navmenu *
{
margin: 0;

padding: 0;
}
.navmenu
{
border: #000 1px solid;
height:
25px;
}
.navmenu li
{
/*水平菜单*/
float: left;
list-style:
none;
position: relative;
}
.navmenu a
{
display: block;

font-size: 12px;
height: 24px;
width: 100px;
line-height: 24px;

background-color: #CDEB8B;
color: #0000ff;
text-decoration: none;

text-align: center;
border-left: #36393D 1px inset;
border-right:
#36393D 1px inset;
border-bottom: #36393D 1px inset;
}

/*单独设置一级菜单样式*/
.navmenu > ul > li > a
{
font-size:
11px;
font-weight: bold;
}
.navmenu a:hover
{
background:
#369;
color: #fff;
}
/*新增的二级菜单部分*/
.navmenu ul ul
{

visibility: hidden; /*开始时是隐藏的*/
position: absolute;
left: 0px;

top: 24px;
}
.navmenu ul li:hover ul, .navmenu ul a:hover ul
{

visibility: visible;
}
.navmenu ul ul li
{
clear: both;
/*垂直显示*/
text-align: left;
}
/*选中菜单项*/
.navmenu .selected
{

padding-left:15px;
background-position-x:0px;
background-image:
url(./res/selected.gif);
background-repeat: no-repeat;

text-decoration:underline;
}

定义CSS后的效果如下:

到此菜单控件已完成。已测试过可以在IE7,IE8,Chrome,Firefox中正常显示,在IE6显示可能会有问题,可以参考纯CSS多级菜单
进行修改,

本文的CSS显示部分参考了此文的介绍。

附上完整代码,如需要可自行下载修改 下载文件

Asp.net 菜单控件的更多相关文章

  1. 简洁的Asp.net菜单控件

    http://www.cnblogs.com/ruinet/archive/2009/11/10/1599984.html asp.net自带的菜单控件采用的table和javascript,导致生成 ...

  2. ASP.NET的面包屑导航控件、树形导航控件、菜单控件

    原文:http://blog.csdn.net/pan_junbiao/article/details/8579293 ASP.NET的面包屑导航控件.树形导航控件.菜单控件. 1. 面包屑导航控件— ...

  3. ASP.NET控件<ASP:Button /> html控件<input type="button">区别联系

    ASP.NET控件<ASP:Button />-------html控件<input type="button">杨中科是这么说的:asp和input是一样 ...

  4. asp.net Login控件基本属性及事件说明

    原文:asp.net Login控件基本属性及事件说明 Login系列控件是微软为了简化我们的开发过程,为我们进行常规的安全开发提供块捷途径. Login系列控件包含下列控件: Login 登录控件 ...

  5. asp.net分页控件

    一.说明 AspNetPager.dll这个分页控件主要用于asp.net webform网站,现将整理代码如下 二.代码 1.首先在测试页面Default.aspx页面添加引用 <%@ Reg ...

  6. asp.net ajax控件tab扩展,极品啊,秒杀其它插件

    说明:asp.net ajax控件tab要设置width和height,而且在线文本编辑器放能够放入tab中,也必须是asp.net的控件型在线文本,例如fckeditor,下面是我设置好的配置. & ...

  7. javascript获取asp.net服务器端控件的值

    代码如下: <%@ Page Language="C#" CodeFile="A.aspx.cs" Inherits="OrderManage_ ...

  8. [ASP.NET]asp.net Repeater控件的使用方法

    asp.net Repeater控件的使用方法 -- : 4770人阅读 评论() 收藏 举报 asp.netserveraspdatasetdeletexhtml 今天学习了,Repeater控件 ...

  9. 关于ASP.net TextBox控件的失去焦点后触发其它事件

    编写人:CC阿爸 2015-2-02 今天在这里,我想与大家一起分享如何处理的ASP.net TextBox控件的失去焦点后触发其它事件的问题,在此做个小结,以供参考.有兴趣的同学,可以一同探讨与学习 ...

随机推荐

  1. codeforces C. k-Tree

    思路:dp[i][j]表示和为i,最大值为j的方案数. #include <cstdio> #include <cstring> #include <algorithm& ...

  2. ORACLE WIN7安装过程截图

    尽管 有点不正规,但还可以.

  3. DB2中SQLSTATE=57016 SQLCODE=-668

    执行 alter table DW_RPT.TRPT_JV_COGNOS_RPT add CENTER_CD varchar(10) ALTER TABLE DW_RPT.TRPT_JV_COGNOS ...

  4. etErrorMode(SEM_NOGPFAULTERRORBOX); 去除错误对话框.

    etErrorMode(SEM_NOGPFAULTERRORBOX);  去除错误对话框. http://www.cnblogs.com/-clq/archive/2012/01/22/2328783 ...

  5. oracle中的exists 和not exists 用法详解(转)

    有两个简单例子,以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; ...

  6. [置顶] 推荐12款很棒的HTML5开发框架和开发工具

    HTML5 在不同的领域让网页设计更强大的.快速,安全,响应式,互动和美丽,这些优点吸引更多的 Web 开发人员使用 HTML5.HTML5 有许多新的特性功能,允许开发人员和设计师创建应用程序和网站 ...

  7. SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录

    14.5.2.4 Locking Reads 锁定读: 如果你查询数据然后插入或者修改相关数据在相同的事务里, 常规的SELECT 语句不能给予足够的保护. 其他事务可以修改或者删除你刚查询相同的记录 ...

  8. 更改Visual Studio 2010/2012/2008的主题设置

    一.更改主题: 主题网站:http://studiostyl.es/ Visual Studio 2010发布也已经有一段时间了,不过安装后默认的白底的主题长时间看代码可能会感觉眼睛酸痛,况且时间长了 ...

  9. 暴力求解——UVA 572(简单的dfs)

    Description The GeoSurvComp geologic survey company is responsible for detecting underground oil dep ...

  10. 351. Android Unlock Patterns

    这个题我真是做得想打人了卧槽. 题目不难,就是算组合,但是因为是3乘3的键盘,所以只需要从1和2分别开始DFS,结果乘以4,再加上5开始的DFS就行了. 问题是这个傻逼题目的设定是,从1到8不需要经过 ...