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表的处理上,我是人工在服务器端输入的数据,大家在自己的应用中可以将功能菜单的设置、修改单独做一个模块,来实现一级菜单及其子菜单项的添加和修改。另外对各角色进行可使用的菜单项的设置问题,我是通过程序来实现的,在这里我就不再细说了。如果有需要的话,我会将程序整理后发布在我的资源里。

原创粉丝点击