本文主要展示Carey在C/S结构下使用DevExpress控件对权限的控制及处理方法.功能导航菜单使用的是NavBarControl.此种做法搭建一次,以后中小型项目即可重复使用,且对权限的控制,更改,业务需求变更等都具有较强的灵活性.
PS:Q群C#DevExpress技术交流 群号:160257101 欢迎各位DevExpress用户进群学习与交流.
在权限控制方面应用比较简单且流行的五表权限结构,即a,用户表(_sysEmployee)b,角色表(_sysRoles)c,功能表(_systemFunction),d用户对角色表(_sysUser_Role),e角色对功能表(_sysRole_Popedom),关系图如下.
在使用NavBarControl动态生成导航菜单时使用的关键表为功能表(_systemFunction),此表字段说明如下:
程序关键代码如下:
04 | /// <returns>成功/失败</returns> |
05 | private boolSystemFunctionLoad() |
07 | DataTabledat= new DataTable(); |
08 | if (AccountInfo._Us_Role==1) |
11 | dat = SystemManage.GetAllSystemFunction(); //查询所有功能菜单 |
15 | dat = SystemManage.GetAllSystemFunction(AccountInfo._Us_Role); //根据角色ID查询相关功能数据集合 |
17 | if (dat != null &&dat.Rows.Count> 0) |
19 | NavBarGroupnbg = null ; |
20 | NavBarItem item = null ; |
21 | for ( int i = 0; i <dat.Rows.Count; i++) |
23 | if (dat.Rows[i][ "levels" ].ToString() == "0" ) |
26 | nbg = new NavBarGroup(); |
27 | nbg.Caption = dat.Rows[i][ "funcName" ].ToString(); |
28 | navBarControl1.Groups.Add(nbg); |
33 | item = new NavBarItem(); |
34 | item.Caption = dat.Rows[i][ "funcName" ].ToString(); //菜单名称 |
35 | item.Name = dat.Rows[i][ "formName" ].ToString(); //窗体路径 |
36 | item.Hint = dat.Rows[i][ "showType" ].ToString(); //打开模式 |
37 | item.LinkClicked += new DevExpress.XtraNavBar.NavBarLinkEventHandler(Item_Click); //赋予单击事件 |
38 | nbg.ItemLinks.Add(item); |
菜单单击事件:
04 | /// <param name="sender"></param> |
05 | /// <param name="e"></param> |
06 | private void Item_Click( object sender, EventArgs e) |
08 | NavBarItemsd = sender as NavBarItem; |
09 | if (sd.Name.Contains( "." )) //根据表SystemFunction-字段formName确定是否点击的为功能菜单 |
13 | groupControl1.Visible = false ; |
14 | System.Reflection.AssemblytempAssembly = System.Reflection.Assembly.GetExecutingAssembly(); //获取包含当前执行的代码的程序集 |
15 | XtraFormfm = (XtraForm)(tempAssembly.CreateInstance(sd.Name)); //反射机制找到指定名称的类型并使用系统激活器创建它的实例 |
18 | fm.AccessibleName = sd.Hint; |
20 | CreateChildForm(fm); //打开窗体 |
24 | XtraMessageBox.Show( "窗口数据配置错误,请联系系统管理员!" , "系统提示" , MessageBoxButtons.OK, MessageBoxIcon.Information); |
打开窗体用到的是xtraTabbedMdiManager控件,该空间允许同时打开多个子窗体,你需要做的就是拖上一个此控件到设计窗体,然后在窗体加载事件中加入xtraTabbedMdiManager1.MdiParent = this;即可.
07 | /// <param name="ChildForm"></param> |
09 | /// <returns></returns> |
11 | public static Form CreateChildForm(XtraFormChildForm) |
15 | foreach (Form frm in mf.MdiChildren) |
19 | if (ChildForm.Text == frm.Text) |
35 | if (ChildForm.AccessibleName == "Show" ) |
39 | ChildForm.MdiParent = mf; |
49 | ChildForm.MaximizeBox = false ; //禁用最大化 |
51 | ChildForm.ShowIcon = false ; //禁用图标 |
53 | ChildForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; //窗体边框样式 |
55 | ChildForm.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; //窗体在中间位置打开 |
57 | ChildForm.ShowInTaskbar = false ; //不在任务栏显示 |
59 | ChildForm.ShowDialog(); //以模式窗体打开 |
最后再附加一段功能增强代码,实现当同时打开多个子窗体时双击page标签关闭窗体的效果.
01 | private void xtraTabbedMdiManager1_MouseDown( object sender, MouseEventArgs e) |
03 | if (e.Button == MouseButtons.Left) |
05 | DateTimedt = DateTime.Now; |
06 | TimeSpan span = dt.Subtract(m_LastClick); |
07 | if (span.TotalMilliseconds< 300) //如果两次点击的时间间隔小于300毫秒,则认为是双击 |
09 | if ( this .MdiChildren.Length> 1) |
11 | this .ActiveMdiChild.Close(); |
13 | m_LastClick = dt.AddMinutes(-1); |
另外的公共菜单诸如修改密码,退出系统,更换皮肤等功能可以用代码直接创建,也可在设计界面创建.
声明: 本文采用 BY-NC-SA 协议进行授权 | Carey's Blog
转载请注明转自《DevExpress控件之NavBarControl灵活使用》
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。