DevExpress控件之NavBarControl灵活使⽤?CareysBlog
本⽂主要展⽰Carey在C/S结构下使⽤DevExpress控件对权限的控制及处理⽅法.功能导航菜单
使⽤的是NavBarControl.此种做法搭建⼀次,以后中⼩型项⽬即可重复使⽤,且对权限的控制,更改,
业务需求变更等都具有较强的灵活性.
PS:QC#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
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            }
另外的公共菜单诸如修改密码,退出系统,更换⽪肤等功能可以⽤代码直接创建,也可在设计界⾯创建.
声明: 本⽂采⽤BY-NC-SA协议进⾏授权 | Carey's Blog
转载请注明转⾃《DevExpress控件之NavBarControl灵活使⽤》

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。