c#实现按用户角色分配菜单的使用权限(WinForm)
来源:互联网 发布:业主信息收集软件 编辑:程序博客网 时间:2024/05/21 09:57
前阵子接个WinForm应用的小程序,要求按用户的角色动态设置可以使用的菜单项(无权使用的灰色显示)。程序做完了,总结了一下解决问题的思路,拿到这里跟大家交流学习一下。
要求:根据用户登录时的角色,来设置其可以使用的菜单项。
我的思路:首先建立三个表:用户角色表 tb_role ( roid roname ) roid - 角色id ,roname - 角色名称
菜单表 tb_menu ( id fmuname fmuid menuname menucap) fmuname父菜单名,fmuid父菜单id,menuname菜单项的英文名称,menucap菜单项显示的中文名
角色菜单表 tb_rolemenu ( roleid menuid )
当用户登录时,根据其用户角色遍历其能使用的菜单项,然后在程序主窗口中初始化所有菜单项(enable属性设置为false),再将能使用的菜单项的enable属性设置为true。
实现:以上步骤中遍历用户角色及能使用的菜单项容易实现,关键在于菜单初始化(所有菜单及其子菜单项),设置能使用的菜单项和菜单初始化的方法类似。下面详细说明一下:
在WinForm应用中,一级菜单为menuStrip,其子菜单项为ToolStripMenuItem,遍历子菜单项时需要进行对象的转换。代码如下:
// 初始化菜单项,全部设置为不可用。
//初始化一级菜单
private void InitMenuItem()
{
string sql = "select * from tb_menu where fmuid = 0 "; //一级菜单,其父菜单id为0
DataTable dt = GetTableBySql(sql);
foreach (DataRow dr in dt.Rows)
{
ToolStripMenuItem item = new ToolStripMenuItem();
item.Name = dr[3].ToString(); //menuname
menuStrip2.Items[item.Name].Enabled = false;
InitSubMenuItem(menuStrip2.Items[item.Name]);
}
}
//初始化一级菜单的所有子菜单
private void InitSubMenuItem(ToolStripItem item)
{
string mname = item.Name;
ToolStripMenuItem pItem = (ToolStripMenuItem)item;
//根据父菜单项加载子菜单
string sql = "select * from tb_menu where fmuname ='" + mname + "'";
DataTable dt = GetTableBySql(sql);
if (dt.Rows.Count != 0)
{
foreach (DataRow dr in dt.Rows)
{
ToolStripMenuItem subItem = new ToolStripMenuItem();
subItem.Name = dr[3].ToString();
try
{
pItem.DropDownItems[subItem.Name].Enabled = false;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
}
}
private DataTable GetTableBySql(string sql)
{
con = gcon.GetCon();
cmd = new SqlCommand(sql, con);
DataTable dt = new DataTable();
SqlDataAdapter adpt = new SqlDataAdapter(cmd);
try
{
adpt.Fill(dt);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
cmd.Connection.Close();
return dt;
}
// 根据用户在用户权限表中的权限动态的设置能使用的菜单项。
//对一级菜单进行权限设置
private void SetMenuItemByRole()
{
string sql = "select * from tb_menu where id in" +
"(select menuid from tb_rolemenu where roleid='" + RoleId + "' and fmuid = 0)";
DataTable dt = GetTableBySql(sql);
foreach (DataRow dr in dt.Rows)
{
ToolStripMenuItem item = new ToolStripMenuItem();
item.Name = dr[3].ToString();//一级菜单的menuname
menuStrip2.Items[item.Name].Enabled = true;//各一级菜单是主菜单menuStrip2集合的项
SetSubMenuItemByRole(menuStrip2.Items[item.Name]);//将一级菜单对应主菜单menuStrip2集合的项传给子菜单设置函数
}
}
//对一级菜单的所有子菜单进行设置
private void SetSubMenuItemByRole(ToolStripItem item)
{
string mname = item.Name;
ToolStripMenuItem pItem = (ToolStripMenuItem)item;
//根据父菜单项加载子菜单
string sql = "select * from tb_menu where fmuname ='" + mname + "' and id in (select menuid from tb_rolemenu where roleid='" + RoleId + "')";
DataTable dt = GetTableBySql(sql);
if (dt.Rows.Count != 0)
{
foreach (DataRow dr in dt.Rows)
{
ToolStripMenuItem subItem = new ToolStripMenuItem();
subItem.Name = dr[3].ToString();
try
{
pItem.DropDownItems[subItem.Name].Enabled = true;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
}
else
{
}
}
//在主窗口加载时调用初始化和设置菜单项工作,要注意顺序,先初始化再设置
private void Main_Load(object sender, EventArgs e)
{
InitMenuItem();
SetMenuItemByRole();
}
以上就是思路和解决方案。需要指出的是,由于时间原因,在对tb_menu表的处理上,我是人工在服务器端输入的数据,大家在自己的应用中可以将功能菜单的设置、修改单独做一个模块,来实现一级菜单及其子菜单项的添加和修改。另外对各角色进行可使用的菜单项的设置问题,我是通过程序来实现的,在这里我就不再细说了。如果有需要的话,我会将程序整理后发布在我的资源里。
- c#实现按用户角色分配菜单的使用权限(WinForm)
- c#实现按用户角色分配菜单的使用权限(WinForm)
- c#实现按用户角色分配菜单的使用权限(WinForm) 转载
- c#实现按用户角色分配菜单的使用权限(WinForm)
- winform:C# WinForm中实现基于角色的权限菜单
- winform:C# WinForm中实现基于角色的权限菜单
- 浅谈C# WinForm中实现基于角色的权限菜单
- 浅谈C# WinForm中实现基于角色的权限菜单
- 浅谈C# WinForm中实现基于角色的权限菜单
- 使用angular 实现简单 用户-角色-菜单-按钮权限控制
- 用户 角色 权限 菜单
- restlet2.1 学习笔记(十一)为用户分配角色,并使用角色控制权限。
- C#WinForm中实现基于角色的权限菜单--C#-程序设计-计算机学习网-育龙网
- MySql用户角色管理及权限分配(使用MySQLMembershipProvider和MySqlRoleProvider)
- 用户多角色权限的实现
- 用flask开发个人博客(34)—— 用户角色权限的分配
- 用户,角色,群组,菜单权限控制
- 用户、权限、角色(4)- 用户角色
- JBuilder2008中文化[原]
- myeclipse 7.0 破解方法(非原创)
- 用异常来处理错误----第二节 异常管理的优势
- 中文化和国际化问题权威解析之二:Java国际化基础
- 数据库备份
- c#实现按用户角色分配菜单的使用权限(WinForm)
- 登录Win xp系统后又自动注销?原来是SP3安装不成功
- 25大软件编程错误不可赦
- 监控不能随便加--记一次除虫过程
- SD2C之三种Python的Web框架
- vb制作简单的多窗口浏览器(6) --判断后退前进
- linggo简介
- 如何学习一个新的PHP框架
- Linux真正价值不仅在于产品本身