当前位置: 移动技术网 > IT编程>开发语言>.net > asp.net(C#)生成无限级别菜单

asp.net(C#)生成无限级别菜单

2017年12月12日  | 移动技术网IT编程  | 我要评论
首先,创建数据库表的代码如下: 无限级树的数据库表代码 复制代码 代码如下: if exists (select * from dbo.sysobjects where i
首先,创建数据库表的代码如下:
无限级树的数据库表代码
复制代码 代码如下:

if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[work_sysmenu]') and objectproperty(id, n'isusertable') = 1)
drop table [dbo].[work_sysmenu]
go
create table [dbo].[work_sysmenu] (
[flowid] [int] identity (1, 1) not null ,
[menu_title] [varchar] (100) collate chinese_prc_ci_as null ,
[menu_value] [varchar] (100) collate chinese_prc_ci_as null ,
[menu_url] [varchar] (500) collate chinese_prc_ci_as null ,
[menu_parent] [int] null ,
[menu_role] [varchar] (200) collate chinese_prc_ci_as null ,
[menu_meno] [text] collate chinese_prc_ci_as null ,
[isvalid] [int] null ,
[menu_order] [int] null
) on [primary] textimage_on [primary]
go

其中,menu_parent为菜单的级别代码,最顶级为0,其他级别代码为上级菜单的flowid。
asp.net中使用导航中的menu控件作为菜单。
首先需要将级别为0的顶级菜单添加到menu中,代码如下:
复制代码 代码如下:

/// <summary>
/// 根据用户权限获取系统菜单
/// </summary>
private void getsysmenu()
{
string str = "select * from work_sysmenu where dbo.getcharcount(menu_role,'" + this.roleid +"')=1 and isvalid=1 order by menu_order";
dataset ds= syssqlrunner.getdataset(str);
datarow[] drroot = ds.tables[0].select("menu_parent=0");
//循环生成父菜单
foreach (datarow dr in drroot)
{
menuitem mi = new menuitem();
mi.text = dr["menu_title"].tostring();
mi.value = dr["menu_value"].tostring();
//mi.navigateurl = dr["menu_url"].tostring();
mi.selectable = false;
mainmenu.items.add(mi);
//递归算法生成所有级别的下级子菜单
createmenu(ds.tables[0], dr["flowid"].tostring(), mi);
}
}

上面的代码中的syssqlrunner.getdataset是我自用的一个数据持久层框架内的方法,用来执行一段sql并返回dataset,这个可以根据自己的需要来使用不同的方法。另外有一条sql语句中包含一个我自己写的自定义函数dbo.getcharcount,作用是获取一个字符串中,某个字符存在的个数。
复制代码 代码如下:

create function getcharcount(@target varchar(100),@sear varchar(1))
returns int
as
begin
declare @charcount int
select @charcount=(len(@target)-len(replace(@target,@sear,'')))
return @charcount
end

下面为生成下级无级树的方法代码:
复制代码 代码如下:

/// <summary>
/// 创建无级树菜单
/// </summary>
/// <param name="dt">获取菜单的数据源</param>
/// <param name="parentid">菜单的父id</param>
/// <param name="paritem">创建菜单的item</param>
private void createmenu(datatable dt,string parentid,menuitem paritem)
{
datarow[] drs= dt.select("menu_parent=" + parentid);
if (drs.length > 0)
{
foreach (datarow dr in drs)
{
menuitem mi = new menuitem();
mi.text = dr["menu_title"].tostring();
mi.value = dr["menu_value"].tostring();
mi.navigateurl = dr["menu_url"].tostring();
paritem.childitems.add(mi);
createmenu(dt, dr["flowid"].tostring(), mi);
}
}
else
{
return ;
}
}

好了,现在只需要在数据表中添加菜单记录,即可生成所需级别的菜单。需要注意的是顶级菜单的menu_parent值必须为0。当然也可以在此基础上根据需要做修改。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网