欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-07 21:06:39
首先,创建数据库表的代码如下: 无限级树的数据库表代码 复制代码 代码如下: 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。当然也可以在此基础上根据需要做修改。