您的位置:首页 > 编程语言 > C#

c#实现按用户角色分配菜单的使用权限(WinForm)

2009-01-13 21:12 966 查看
前阵子接个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表的处理上,我是人工在服务器端输入的数据,大家在自己的应用中可以将功能菜单的设置、修改单独做一个模块,来实现一级菜单及其子菜单项的添加和修改。另外对各角色进行可使用的菜单项的设置问题,我是通过程序来实现的,在这里我就不再细说了。如果有需要的话,我会将程序整理后发布在我的资源里。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐