DevExpress AccordionControl 左侧导航

1 SQL创建菜单表

CREATE TABLE [dbo].[pubMenuInfo1]
(
[uMenuID] [uniqueidentifier] NOT NULL,
[sMenuID] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL,
[sMenuName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL,
[sDescript] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL,
[uSysID] [uniqueidentifier] NOT NULL,
[sParentMenuName] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL,
[uParentMenuID] [uniqueidentifier] NULL,
[bUsable] [bit] NOT NULL,
[sClassPath] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NULL,-- 调用窗体的类  用逗号分开 程序集,命名空间,类名
[sParameter] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL  -- 调用窗体的类的参数  用逗号分开 参数1,参数2
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[pubMenuInfo1] ADD CONSTRAINT [PK_pubMenuInfo1] PRIMARY KEY CLUSTERED  ([uMenuID]) ON [PRIMARY]
GO

2 根据菜单表生成菜单

2.1 生成父菜单

// 查询菜单数据
dsMenu1 = database.GetDataSource(@" SELECT uMenuID ,sMenuID ,sMenuName ,sDescript ,uSysID ,sParentMenuName ,uParentMenuID ,uParentMenuID as uPID,bUsable ,sClassPath ,sParameterFROM  dbo.pubMenuInfo1 WITH(NOLOCK) "+ "  Where bUsable=1 order by sMenuID",DataBaseOperate.strConnection, "menu");// AccordionControl 生成父菜单acControl.Elements.Clear();acControl.BeginUpdate();List<AccordionControlElement> lsRoot = new List<AccordionControlElement>();// 找到根节点 g.Field<string>("sParentMenuName") == ""var group = from g in dsMenu1.Tables[0].AsEnumerable()where (g.Field<string>("sParentMenuName") == "" ) select new{sMenuID = g.Field<string>("sMenuID"),sMenuName = g.Field<string>("sMenuName"),sParentMenuName = g.Field<string>("sParentMenuName")};foreach (var gp in group) // {  var acRootGroupHome = new AccordionControlElement();acRootGroupHome.Name = gp.sMenuID;acRootGroupHome.Text = gp.sMenuName;var SUBCOUNT = dsMenu1.Tables[0].AsEnumerable().Where(LL => LL.Field<string>("sParentMenuName") == gp.sMenuName).Count();if (SUBCOUNT > 0)//没有下级节点{//acRootGroupHome 节点有子节点则【递归】additem(gp.sMenuName, acRootGroupHome);}根节点 添加到  acControlacControl.Elements.Add(acRootGroupHome);}acControl.ElementClick += new ElementClickEventHandler(this.accordionControl1_ElementClick);acControl.EndUpdate();

2.2 添加子菜单

//-------------------添加子菜单
private void additem(string sMenuName, AccordionControlElement ACEGROUP){try{// 查找子菜单var qitem = from k in dsMenu1.Tables[0].AsEnumerable()where (k.Field<string>("sParentMenuName") == sMenuName)select new{sMenuID = k.Field<string>("sMenuID"),sMenuName = k.Field<string>("sMenuName"),sParentMenuName = k.Field<string>("sParentMenuName")};foreach (var k in qitem){var SubItem = new AccordionControlElement();SubItem.Name = k.sMenuID;SubItem.Text = k.sMenuName;var SUBCOUNT = dsMenu1.Tables[0].AsEnumerable().Where(LL => LL.Field<string>("sParentMenuName") == SubItem.Text).Count();if (SUBCOUNT == 0)//没有下级节点{SubItem.Style = ElementStyle.Item;SubItem.Tag = SubItem.Name;}else{//有下级节点 递归additem(SubItem.Text, SubItem);}子节点 加入父节点     ACEGROUP.Elements.AddRange(new AccordionControlElement[]{ SubItem });}}catch (Exception ex){MessageBox.Show(ex.Message);}}

2.3 菜单点击事件

通过反射调用类的方法

  //-------------------执行菜单点击事件private void accordionControl1_ElementClick(object sender, DevExpress.XtraBars.Navigation.ElementClickEventArgs e){if (e.Element.Style == ElementStyle.Group)return;if (e.Element.Tag == null) return;var sMenuID = e.Element.Name;// 得到 调用打开窗体的类, 参数string itemID = e.Element.Tag.ToString();var dr = dsMenu1.Tables[0].Select($"sMenuID='{sMenuID}'");FormOpenParameters c1 = new FormOpenParameters();object[] oParameter = null;if (dr[0]["sParameter"].ToString() != ""){c1.p_arry = dr[0]["sParameter"].ToString().Split(',');oParameter = new object[] { c1 };}else{oParameter = new object[] { "" };}var sClassPath = dr[0]["sClassPath"].ToString().Split(',');// 调用窗体类的路径string assemblyName = sClassPath[0];string nameSpace = sClassPath[1];string className = sClassPath[2];string methodName = sClassPath[3];GetInvokeMethod(assemblyName, nameSpace, className, methodName, oParameter);}//------------------------------------------------------------------------------------------------------------------------------------------// 窗体参数类public class FormOpenParameters{public string[] p_arry;// 参数数组   打开窗体传入参数}#region 反射调用类的方法实例/// <summary>/// 调用方法实例/// </summary>/// <typeparam name="T">对象类型</typeparam>/// <param name="assemblyName">程序集名称</param>/// <param name="nameSpace">命名空间</param>/// <param name="className">类名</param>/// <returns></returns>public void GetInvokeMethod(string assemblyName, string nameSpace, string className, string methodName, object[] paras){try{ //获取程序集集合,找出需要用的那个Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();Assembly assembly = assemblies.Where(p => p.FullName.Contains(assemblyName)).FirstOrDefault();//命名空间.类名string path = nameSpace + "." + className;//+ "," + assemblyName//加载类型//Type type = Type.GetType(path);Type type = assembly.GetType(path);if (type == null){throw new Exception("窗体未找到");}//根据类型创建实例object obj = Activator.CreateInstance(type, true);if (obj == null){throw new Exception("窗体创建失败");}//加载方法参数类型及方法MethodInfo method = null;if (paras != null && paras.Length > 0){//加载方法参数类型Type[] paratypes = new Type[paras.Length];for (int i = 0; i < paras.Length; i++){paratypes[i] = paras[i].GetType();}//加载有参方法 调用public方法method = type.GetMethod(methodName, paratypes);}else{//加载无参方法method = type.GetMethod(methodName);}if (method == null){throw new Exception("方法未找到");}//调用方法method.Invoke(obj, paras);}catch (Exception ex){MessageBox.Show(ex.Message);}}#endregion

AccordionControl 左侧导航相关推荐

  1. 点击左侧导航栏切换右侧商品(左右联动)

    点击左侧导航栏切换右侧商品(左右联动) 菜单栏主要以 A,B,C,D等字母为主,即A,B,C,D等字母为对应该项携带的 id(id不能为汉字或纯数字). 实现该功能的思路:通过点击左侧滑栏的某一项,获 ...

  2. CSS3构建左侧导航栏

    废话不说,先上图 代码: <!DOCTYPE html> <html lang="en"> <head><meta charset=&qu ...

  3. vue项目中处理左侧导航栏问题的分享

    2019独角兽企业重金招聘Python工程师标准>>> 相信左侧导航栏大家都不陌生,几乎每个项目都会存在.以前用jquery做的时候,某些本不是什么问题的地方就突然变成阻碍了.下面就 ...

  4. android左侧固定导航栏,Android使用fragment实现左侧导航

    使用简单的fragment实现左侧导航,供大家参考,具体内容如下 先上效果图: MainActivity.java public class MainActivity extends Fragment ...

  5. 后台管理页面布局(左侧导航长度根据右侧内容无限延伸)

    2019独角兽企业重金招聘Python工程师标准>>>     如图为标准后台管理页面布局,左侧导航布局一般是设置高度100%来适应所有尺寸的显示器打开的浏览器高度. 但是这种布局会 ...

  6. xcode 左侧导航栏 no finder results 问题的解决方法

    第一天使用xcode就遇到个很郁闷的问题,刚建的新工程,不知道怎么操作了,左侧导航栏的文件夹和文件等资源都没有了,只显示个"no finder results",试了各种方法都弄不 ...

  7. 修改Sublime Text3左侧导航字号大小及行高

    今天安装了Sublime Text3,安装的中文版,左侧导航文字比较小,不利于查看,所以在网上各种搜索修改方式,但是并没有什么卵用 所以今天自己整理一下修改方式,直接上图,该文件的目录(根据个人安装目 ...

  8. 修改左侧导航显示样式(转载自Sunmoonfire's artistic matrix)

    这是一片非常好的文章,修改下CSS就可以改变左侧导航栏的样式,在网上找了一些都是要写代码的.怕连接失效,所以直接将文章考了过来,希望作者原谅,如有不妥,请通知一声,我会将文章删掉! WSS3SDK之: ...

  9. 在ECSHOP后台左侧导航中增加新菜单

    在ECSHOP后台左侧导航中增加新菜单 ECSHOP教程 / ecshop 教程网(www.ecshop119.com) 2011-11-08 有个别高级用户(懂PHP的),提到这样的问题: 在后台管 ...

最新文章

  1. java jersey使用总结_jersey使用指南
  2. laravel 框架基础 学习整理
  3. mvc根据绝对路径下载文件
  4. 编译原理题练习题测试题
  5. Clion this file does not belong to any project target问题解决方案
  6. 为 Angular service 注册 provider 的三种方式
  7. python 抓包基于pypcap
  8. Linux 桌面进化史
  9. 基于jquery横向手风琴效果
  10. Python 批量推送微信公众号模板消息
  11. u盘安装红旗linux操作系统,如何用u盘安装红旗linux?
  12. deepin 服务器_深度官方并没有提供Deepin服务器版下载,也没有开发计划
  13. mac上Python版本不同时给指定的版本安装库
  14. 【环境部署系列 04】Ascend 310(推理)ARM服务器 Ubuntu系统环境部署
  15. 剑指offter27. 数值的整数次方-java实现
  16. Android源码在线查看网站
  17. java 一年后时间_java 计算当前日期之后一年半是几几年几月几日
  18. 悄悄分享 60 个相见恨晚的神器工具
  19. 艾媒直播行业报告出炉 花椒直播何以扩大领先优势?
  20. LLYF VirtualTyper W.I.P

热门文章

  1. 所谓深度链接(Deep linking)
  2. 工作两年之后,我决定考研了
  3. 转黄金的沉默与辉煌[时寒冰]2013-04-13
  4. ERPbuilder:企业电商精细化运营管理专家
  5. C语言——求s=a+aa+aaa+aaaa+aa...a的值
  6. rmd中将html转为pdf,RMD转换为PDF
  7. php重定向和转发的区别,PHP重定向和页面快速转向
  8. 5G物联网如何推动边缘计算
  9. arduino / VScode+platformIO搭建esp32/esp8266编译环境(一篇足矣)
  10. 内部计算机有mac吗,电脑内部录音软件如何录音 mac怎么录音