求动态生成菜单的代码

skykevin 2003-09-02 08:43:39
在如下示意的一种可能结构中:
m0 m1 m2
m01 m20
m02 m21------m210
m03 m22 m211
... ... m212
......

菜单层次事先不确定,有可能只有一级菜单,有可能有二级,也可能有三级,甚至更多,反正不能有限制,菜单项存在库表中,并为自连接,如下:
menuitem menuitem_parent
m01 m0
m20 m2
.......

在此前提下,求一次生成菜单的方法及代码。

email: tyldl@sina.com
...全文
70 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
skykevin 2003-09-02
  • 打赏
  • 举报
回复
楼上zhouzhouzhou:
如果第二级菜单有m00、m01两项,m00又有m000、m001、m002三项,这时递归调用,经由m00->m000后就会结束递归。遍历不到m01、 m001、 m002。
angelior 2003-09-02
  • 打赏
  • 举报
回复
先是構造第一級的全部菜單

然后在循環。

skykevin 2003-09-02
  • 打赏
  • 举报
回复
楼上zhouzhouzhou:
感谢及时相助。初读代码,有点疑惑:关于递归调用中的“DataRow[] rows = temp.Select("sjmkbm = " + iniMkbm)”,如果树的某一支,达到叶节点(如rows==null),将结束菜单构造,不能遍历整个菜单树,只能是其中一支。望给予明示。
angelior 2003-09-02
  • 打赏
  • 举报
回复
我的代碼就是實際運用成功的。
zhbname 2003-09-02
  • 打赏
  • 举报
回复
你可以将菜单当成树来对待.如我新增一个菜单项,我就得到一个M1.新增子项
就得到M10.在数据方面有两种方式确定:一种方式通过建立数据表,通过递归
的方式读出这张表.另一种通过建立XML数据来关联.具体的代码,你要自已动手.
angelior 2003-09-02
  • 打赏
  • 举报
回复
本代碼是根據用戶的權限來動態生成的。
public class MenuEvent
{
private static string _flag="";
private static Form _mdi=null;

public static string flag
{
get {return _flag;}
set {_flag = value;}
}

public static Form mdi
{
get {return _mdi;}
set {_mdi = value;}
}

public MenuEvent()
{
//
// TODO: Add constructor logic here
//
}

//創建第一級菜單
public static void MakeMenuItem(ref System.Windows.Forms.MainMenu MainMenu,string strUserName,string strDeptNo)
{
flag = "";
MainMenu.MenuItems.Clear();
MenuItem m = new MenuItem();
string strSQL = "SELECT distinct y.mkbm,y.mkmc,y.sjmkbm,y.sfzjd FROM "
+ "(select a.js,b.mkbm from b_czryjs a inner join b_qxqd b on a.js=b.js "
+ "where a.yhm='"+strUserName+"' and a.bmbh='"+strDeptNo+"')x,b_mkqd y "
+ "where x.mkbm=y.mkbm order by y.mkbm";

SqlDataAdapter da = new SqlDataAdapter(strSQL,DB.SQLServer.GetConnection());
DataTable MenuTemp = new DataTable();
da.Fill(MenuTemp);
da.Dispose();

//生成總結點
DataRow[] rows = MenuTemp.Select("sjmkbm = " + 0);
if (rows.Length > 0)
{
GenMenu(ref MainMenu,ref MenuTemp,rows[0][1].ToString(),m,(int)rows[0][0],(bool)rows[0][3]);
}
else
{
MessageBox.Show("請與系統管理員聯繫,您當前的系統權限存在問題!","系統提示",MessageBoxButtons.OK,MessageBoxIcon.Warning);
return;
}

MenuTemp.Dispose();
rows = null;
}
//遞歸方法創建相對應下級菜單
public static void GenMenu(ref System.Windows.Forms.MainMenu MainMenu,ref DataTable temp,string Mkmc,MenuItem m0,int iniMkbm,bool leaf)
{
MenuItem m=new MenuItem();
m.Text=Mkmc;
if (iniMkbm.ToString().Length==4)
{
MainMenu.MenuItems.Add(m);
}
else
{
m0.MenuItems.Add(m);
if (leaf)
{
m.Click+=new EventHandler(event_Handler);
}
}

DataRow[] rows = temp.Select("sjmkbm = " + iniMkbm);
if (rows.Length >0)
{
for(int i = 0;i < rows.Length;i++)
{
GenMenu(ref MainMenu,ref temp,rows[i][1].ToString(),m,(int)rows[i][0],(bool)rows[i][3]);
}
}
}
}

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧