AccordionControl 左侧导航
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 左侧导航相关推荐
- 点击左侧导航栏切换右侧商品(左右联动)
点击左侧导航栏切换右侧商品(左右联动) 菜单栏主要以 A,B,C,D等字母为主,即A,B,C,D等字母为对应该项携带的 id(id不能为汉字或纯数字). 实现该功能的思路:通过点击左侧滑栏的某一项,获 ...
- CSS3构建左侧导航栏
废话不说,先上图 代码: <!DOCTYPE html> <html lang="en"> <head><meta charset=&qu ...
- vue项目中处理左侧导航栏问题的分享
2019独角兽企业重金招聘Python工程师标准>>> 相信左侧导航栏大家都不陌生,几乎每个项目都会存在.以前用jquery做的时候,某些本不是什么问题的地方就突然变成阻碍了.下面就 ...
- android左侧固定导航栏,Android使用fragment实现左侧导航
使用简单的fragment实现左侧导航,供大家参考,具体内容如下 先上效果图: MainActivity.java public class MainActivity extends Fragment ...
- 后台管理页面布局(左侧导航长度根据右侧内容无限延伸)
2019独角兽企业重金招聘Python工程师标准>>> 如图为标准后台管理页面布局,左侧导航布局一般是设置高度100%来适应所有尺寸的显示器打开的浏览器高度. 但是这种布局会 ...
- xcode 左侧导航栏 no finder results 问题的解决方法
第一天使用xcode就遇到个很郁闷的问题,刚建的新工程,不知道怎么操作了,左侧导航栏的文件夹和文件等资源都没有了,只显示个"no finder results",试了各种方法都弄不 ...
- 修改Sublime Text3左侧导航字号大小及行高
今天安装了Sublime Text3,安装的中文版,左侧导航文字比较小,不利于查看,所以在网上各种搜索修改方式,但是并没有什么卵用 所以今天自己整理一下修改方式,直接上图,该文件的目录(根据个人安装目 ...
- 修改左侧导航显示样式(转载自Sunmoonfire's artistic matrix)
这是一片非常好的文章,修改下CSS就可以改变左侧导航栏的样式,在网上找了一些都是要写代码的.怕连接失效,所以直接将文章考了过来,希望作者原谅,如有不妥,请通知一声,我会将文章删掉! WSS3SDK之: ...
- 在ECSHOP后台左侧导航中增加新菜单
在ECSHOP后台左侧导航中增加新菜单 ECSHOP教程 / ecshop 教程网(www.ecshop119.com) 2011-11-08 有个别高级用户(懂PHP的),提到这样的问题: 在后台管 ...
最新文章
- java jersey使用总结_jersey使用指南
- laravel 框架基础 学习整理
- mvc根据绝对路径下载文件
- 编译原理题练习题测试题
- Clion this file does not belong to any project target问题解决方案
- 为 Angular service 注册 provider 的三种方式
- python 抓包基于pypcap
- Linux 桌面进化史
- 基于jquery横向手风琴效果
- Python 批量推送微信公众号模板消息
- u盘安装红旗linux操作系统,如何用u盘安装红旗linux?
- deepin 服务器_深度官方并没有提供Deepin服务器版下载,也没有开发计划
- mac上Python版本不同时给指定的版本安装库
- 【环境部署系列 04】Ascend 310(推理)ARM服务器 Ubuntu系统环境部署
- 剑指offter27. 数值的整数次方-java实现
- Android源码在线查看网站
- java 一年后时间_java 计算当前日期之后一年半是几几年几月几日
- 悄悄分享 60 个相见恨晚的神器工具
- 艾媒直播行业报告出炉 花椒直播何以扩大领先优势?
- LLYF VirtualTyper W.I.P
热门文章
- 所谓深度链接(Deep linking)
- 工作两年之后,我决定考研了
- 转黄金的沉默与辉煌[时寒冰]2013-04-13
- ERPbuilder:企业电商精细化运营管理专家
- C语言——求s=a+aa+aaa+aaaa+aa...a的值
- rmd中将html转为pdf,RMD转换为PDF
- php重定向和转发的区别,PHP重定向和页面快速转向
- 5G物联网如何推动边缘计算
- arduino / VScode+platformIO搭建esp32/esp8266编译环境(一篇足矣)
- 内部计算机有mac吗,电脑内部录音软件如何录音 mac怎么录音