打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
DevExpress控件之NavBarControl灵活使用 ? Carey's Blog

本文主要展示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),此表字段说明如下:

 

程序关键代码如下:

01/// <summary>
02/// 加载导航菜单
03/// </summary>
04/// <returns>成功/失败</returns>
05private boolSystemFunctionLoad()
06{
07    DataTabledat=new DataTable();
08    if (AccountInfo._Us_Role==1)
09    {
10        //如果为管理员
11        dat = SystemManage.GetAllSystemFunction();//查询所有功能菜单
12    }
13    else
14    {
15        dat = SystemManage.GetAllSystemFunction(AccountInfo._Us_Role);//根据角色ID查询相关功能数据集合
16    }
17    if (dat != null &&dat.Rows.Count> 0)
18    {
19        NavBarGroupnbg = null;
20        NavBarItem item = null;
21        for (int i = 0; i <dat.Rows.Count; i++)
22        {
23            if (dat.Rows[i]["levels"].ToString() == "0")
24            {
25                //父级菜单
26                nbg = new NavBarGroup();
27                nbg.Caption = dat.Rows[i]["funcName"].ToString();
28                navBarControl1.Groups.Add(nbg);
29            }
30            else
31            {
32                //子级菜单
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);
39            }
40        }
41        return true;
42    }
43    else
44        return false;
45}

菜单单击事件:

01/// <summary>
02/// 菜单单击事件
03/// </summary>
04/// <param name="sender"></param>
05/// <param name="e"></param>
06private void Item_Click(object sender, EventArgs e)
07{
08    NavBarItemsd = sender as NavBarItem;
09    if (sd.Name.Contains("."))//根据表SystemFunction-字段formName确定是否点击的为功能菜单
10    {
11        try
12        {
13            groupControl1.Visible = false;
14            System.Reflection.AssemblytempAssembly = System.Reflection.Assembly.GetExecutingAssembly();//获取包含当前执行的代码的程序集
15            XtraFormfm = (XtraForm)(tempAssembly.CreateInstance(sd.Name)); //反射机制找到指定名称的类型并使用系统激活器创建它的实例
16            if (fm != null)
17            {
18                fm.AccessibleName = sd.Hint;
19                fm.Text = sd.Caption;
20                CreateChildForm(fm);//打开窗体
21            }
22            else
23            {
24                XtraMessageBox.Show("窗口数据配置错误,请联系系统管理员!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
25            }
26        }
27        catch (Exception)
28        {
29        }
30    }
31}

打开窗体用到的是xtraTabbedMdiManager控件,该空间允许同时打开多个子窗体,你需要做的就是拖上一个此控件到设计窗体,然后在窗体加载事件中加入xtraTabbedMdiManager1.MdiParent = this;即可.

01/// <summary>
02 
03        /// 打开窗体
04 
05        /// </summary>
06 
07        /// <param name="ChildForm"></param>
08 
09        /// <returns></returns>
10 
11        public static Form CreateChildForm(XtraFormChildForm)
12 
13        {
14 
15            foreach (Form frm in mf.MdiChildren)
16 
17            {
18 
19                if (ChildForm.Text == frm.Text)
20 
21            {
22 
23                    ChildForm.Close();
24 
25                    ChildForm.Dispose();
26 
27                    frm.Activate();
28 
29                    return frm;
30 
31                }
32 
33        }
34 
35            if (ChildForm.AccessibleName == "Show")
36 
37            {
38 
39                ChildForm.MdiParent = mf;
40 
41                ChildForm.Show();
42 
43            }
44 
45            else
46 
47            {
48 
49                ChildForm.MaximizeBox = false;//禁用最大化            
50 
51                ChildForm.ShowIcon = false;//禁用图标
52 
53            ChildForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;//窗体边框样式
54 
55                ChildForm.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;//窗体在中间位置打开
56 
57                ChildForm.ShowInTaskbar = false;//不在任务栏显示
58 
59                ChildForm.ShowDialog();//以模式窗体打开
60 
61        }
62 
63            return ChildForm;
64 
65        }

最后再附加一段功能增强代码,实现当同时打开多个子窗体时双击page标签关闭窗体的效果.

01private void xtraTabbedMdiManager1_MouseDown(object sender, MouseEventArgs e)
02        {
03        if (e.Button == MouseButtons.Left)
04        {
05                DateTimedt = DateTime.Now;
06                TimeSpan span = dt.Subtract(m_LastClick);
07                if (span.TotalMilliseconds< 300)  //如果两次点击的时间间隔小于300毫秒,则认为是双击
08                {
09                    if (this.MdiChildren.Length> 1)
10                    {
11                    this.ActiveMdiChild.Close();
12               }
13                    m_LastClick = dt.AddMinutes(-1);
14                }
15                else
16                    m_LastClick = dt;
17            }
18        }

另外的公共菜单诸如修改密码,退出系统,更换皮肤等功能可以用代码直接创建,也可在设计界面创建.

声明: 本文采用 BY-NC-SA 协议进行授权 | Carey's Blog
转载请注明转自《DevExpress控件之NavBarControl灵活使用

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
DevExpress 中根据数据库字典动态生成卡式菜单
DexExpress控件使用总结
合理的布局,绚丽的样式,谈谈Winform程序的界面设计
转载C#利用读取xml生成动态菜单
c#新手的一些编程帮助(自己再开发中搜索收集)
c#教程之编写多文档界面应用程序
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服