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小时内删除。
发表评论