zoukankan      html  css  js  c++  java
  • c#权限管理动态增加menu及时间

    在C# WinForm中使用菜单控件,我想MenuStrip是很多人的首选,如何使用我就不多说了,我就讲讲个人的使用心得。
    以前在使用该控件的时候只知道在窗体设计器中手动输入菜单项目,这样做是比较方便,但却不灵活。
    某次要做的一个项目,涉及到权限分配,不同权限的人需要用到不同的菜单,这就需要在窗体载入的时候动态创建MenuStrip及其菜单项目。
    后来上网搜索了很多相关创建动态菜单的代码,但却都不理想,最后只能自己取各家所长,自己动手修改完成了这个东西。
    我的思路是这样的:
    1、首先要在数据库里创建一个菜单表TB_MENU,字段主要有
    --------------------------
    ID-唯一标识值
    FATHER_ID-菜单项目的父ID,如果是顶级菜单则为0
    MENU_NAME-该菜单项在窗体中的控件名称
    MENU_TEXT-该菜单项显示名称
    MODULE_ACTION-该菜单项目要招待的事件名称,带括号,例如:btnCreateUser_click()
    --------------------------
    这些字段是必需的,其他的就要根据你的实际情况而定了。
    2、在窗体中拖放一个MenuStrip控件,名称为MainMenu1
    3、在窗体代码的FORM_LOAD中加入以下语句:CreateMenu();
    当然如果情况特殊,也可以在别的地方加入该句代码,视实际情况自己决定。
    4、在相关窗体代码中加入以下构造函数
        public void CreateMenu()
            {
               
                //取所有菜单项的语句,如果有权限限制等情况自行修改
                String menuSql="select * from TB_MENU";
                //取得菜单项数据集
                DataSet ds = DbClass.getDataSet(menuSql);
                //检查判断DataSet数据是否完整
                if (CheckData(ds))
                {
                    //加载MenuStrip菜单
                    ToolStripMenuItem topMenu = new ToolStripMenuItem();
                    LoadSubMenu(ref topMenu, "0");
                }
              
            }
            /// <summary>
            /// 递归创建MenuStrip菜单(模块列表)
            /// </summary>
            /// <param name="topMenu">父菜单项</param>
            /// <param name="FATHER_ID">父菜单的ID</param>
            private void LoadSubMenu(ref ToolStripMenuItem topMenu, String inFatherId)
            {
                DataView dvList = new DataView(menuTable);
                //过滤出当前父菜单下在所有子菜单数据(仅为下一层的)
                dvList.RowFilter = "FATHER_ID='" + inFatherId + "'";
                ToolStripMenuItem subMenu;
                foreach (DataRowView dv in dvList)
                {
                    //创建子菜单项
                    subMenu = new ToolStripMenuItem();
                    subMenu.Name = dv["MENU_NAME"].ToString();
                    subMenu.Text = dv["MENU_TEXT"].ToString();
                    //判断是否为顶级菜单
                    if (inFatherId == "0")
                    {
                        MainMenu1.Items.Add(subMenu);
                    }
                    else
                    {
                        subMenu.Tag = dv["MODULE_ACTION"].ToString();
                        String str = " void " + dv["MODULE_ACTION"].ToString();
                        //给菜单项加事件。
                        subMenu.Click += new EventHandler(subMenu_Click);
                        topMenu.DropDownItems.Add(subMenu);
                    }
                    //递归调用
                    LoadSubMenu(ref subMenu, dv["ID"].ToString());
                }
            }
    
            /**/
            /// <summary>
            /// 菜单单击事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void subMenu_Click(object sender, EventArgs e)
            {
                try
                {
                    //tag属性在这里有用到。
                    string acName = ((ToolStripMenuItem)sender).Tag.ToString();
                    if (acName != "")
                    {
                        string[] strArray = acName.Split(new char[] { ',' });
                        if (strArray.Length > 2)
                        {
                        }
                        else
                        {
                            String str = "void " + acName;
                            foreach (MethodInfo info in base.GetType().GetMethods())
                            {
                                if (str.Trim().ToLower().CompareTo(info.ToString().Trim().ToLower()) == 0)
                                {
                                    info.Invoke(this, null);
                                }
                            }
                        }
                    }
                }
                catch (Exception exception)
                {
                }
            }
            //检查判断DataSet数据是否完整
            public static bool CheckData(DataSet inData)
            {
                bool flag = false;
                if (CheckTable(inData))
                {
                    for (int i = 0; i < inData.Tables.Count; i++)
                    {
                        if (inData.Tables.Rows.Count > 0)
                        {
                            flag = true;
                        }
                    }
                    return flag;
                }
                return false;
            }
           public static bool CheckTable(DataSet inData)
            {
                if (inData == null)
                {
                    return false;
                }
                return (inData.Tables.Count > 0);
            }
  • 相关阅读:
    70.BOM
    69.捕获错误try catch
    68.键盘事件
    523. Continuous Subarray Sum
    901. Online Stock Span
    547. Friend Circles
    162. Find Peak Element
    1008. Construct Binary Search Tree from Preorder Traversal
    889. Construct Binary Tree from Preorder and Postorder Traversal
    106. Construct Binary Tree from Inorder and Postorder Traversal
  • 原文地址:https://www.cnblogs.com/anbylau2130/p/3054731.html
Copyright © 2011-2022 走看看