c#实现按用户角色分配菜单的使用权限(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表的处理上,我是人工在服务器端输入的数据,大家在自己的应用中可以将功能菜单的设置、修改单独做一个模块,来实现一级菜单及其子菜单项的添加和修改。另外对各角色进行可使用的菜单项的设置问题,我是通过程序来实现的,在这里我就不再细说了。如果有需要的话,我会将程序整理后发布在我的资源里。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jothan/archive/2009/01/13/3771188.aspx