您现在的位置: 365建站网 > 365文章 > ExtAspNet应用技巧(十五) - 树形菜单与手风琴式菜单

ExtAspNet应用技巧(十五) - 树形菜单与手风琴式菜单

文章来源:365jz.com     点击数:1272    更新时间:2009-09-17 10:29   参与评论

界面截图

手风琴式菜单




树形菜单



数据库表(X_Menu)


设计视图: 


数据: 



ASPX标签定义

在上一篇文章中已经对前台页面定义有了详细的描述。

</>code

  1. <ext:Region ID="regionLeft" Split="true" Width="200px" Margins="0 0 0 0" ShowHeader="true"
  2. Title="菜单" EnableCollapse="true" Layout="Fit" Position="Left" runat="server">
  3. </ext:Region>



动态创建树形菜单

</>code

  1. protected void Page_Init(object sender, EventArgs e)
  2. {
  3. InitMenu();
  4. }
  5. private void InitMenu()
  6. {
  7. XMenuCollection menus = new Select().From<XMenu>()
  8. .Where(XMenu.ShowColumn).IsEqualTo(true)
  9. .OrderAsc(XMenu.SortIndexColumn.ColumnName)
  10. .ExecuteAsCollection<XMenuCollection>();
  11. if (XConfigHelper.MenuType.ToLower() == "accordion")
  12. {
  13. // TODO 创建手风琴式菜单
  14. }
  15. else
  16. {
  17. ExtAspNet.Tree tree = new ExtAspNet.Tree();
  18. regionLeft.Items.Add(tree);
  19. tree.ShowBorder = false;
  20. tree.ShowHeader = false;
  21. tree.AutoScroll = true;
  22. tree.EnableArrows = true;
  23. ResolveMenuTree(menus, 0, tree.Nodes);
  24. }
  25. }
  26. /// <summary>
  27. /// 生成菜单树
  28. /// </summary>
  29. /// <param name="menus"></param>
  30. /// <param name="parentMenuId"></param>
  31. /// <param name="nodes"></param>
  32. /// <returns>当前节点的子节点个数</returns>
  33. private int ResolveMenuTree(XMenuCollection menus, int parentMenuId, ExtAspNet.TreeNodeCollection nodes)
  34. {
  35. int count = 0;
  36. foreach (XMenu menu in menus)
  37. {
  38. if (menu.ParentMenuId == parentMenuId)
  39. {
  40. ExtAspNet.TreeNode node = new ExtAspNet.TreeNode();
  41. nodes.Add(node);
  42. node.Text = menu.Name;
  43. node.IconUrl = menu.ImageUrl;
  44. if (!String.IsNullOrEmpty(menu.NavigateUrl))
  45. {
  46. node.NavigateUrl = menu.NavigateUrl;
  47. node.Target = "main";
  48. }
  49. int childCount = ResolveMenuTree(menus, menu.Id, node.Nodes);
  50. if (childCount == 0)
  51. {
  52. node.Leaf = true;
  53. }
  54. count++;
  55. }
  56. }
  57. return count;
  58. }


在这段代码中,有几点需要注意的地方:
  • 由于需要动态创建控件,所以最好放在Page_Init中而不是Page_Load
  • 使用SubSonic从数据库检索数据相当方便,这里只检索需要显示的菜单
  • ResolveMenuTree用于递归生成Tree控件,特别注意这里通过返回值来标示当前节点的子节点数,从而为node.Leaf赋值



创建手风琴式菜单

下面看下 “// TODO 创建手风琴式菜单” 的代码:

</>code

  1. ExtAspNet.Accordion accordion = new ExtAspNet.Accordion();
  2. regionLeft.Items.Add(accordion);
  3. accordion.ShowBorder = false;
  4. accordion.ShowHeader = false;
  5. foreach (XMenu menu in menus)
  6. {
  7. if (menu.ParentMenuId == 0)
  8. {
  9. ExtAspNet.AccordionPane pane = new ExtAspNet.AccordionPane();
  10. accordion.Panes.Add(pane);
  11. pane.Title = menu.Name;
  12. pane.ShowBorder = false;
  13. ExtAspNet.Tree tree = new ExtAspNet.Tree();
  14. pane.Items.Add(tree);
  15. tree.ShowBorder = false;
  16. tree.ShowHeader = false;
  17. tree.AutoScroll = true;
  18. tree.EnableArrows = true;
  19. ResolveMenuTree(menus, menu.Id, tree.Nodes);
  20. }
  21. }


通过所有的一级菜单(menu.ParentMenuId == 0)创建Accordion控件,然后二级以下菜单创建AccordionPane中的子控件 - Tree。


下一章,我们使用Grid控件来完成“菜单管理”模块,包括菜单的增删改查(CRUD)。


下载全部源代码


如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛

发表评论 (1272人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
昵称:
最新评论
------分隔线----------------------------

快速入口

· 365软件
· 杰创官网
· 建站工具
· 网站大全

其它栏目

· 建站教程
· 365学习

业务咨询

· 技术支持
· 服务时间:9:00-18:00
365建站网二维码

Powered by 365建站网 RSS地图 HTML地图

copyright © 2013-2024 版权所有 鄂ICP备17013400号