c 动态添加控件

来源:互联网 发布:vscode错误提示 编辑:程序博客网 时间:2024/05/17 07:49

C#动态创建菜单

 
一、加入所需数据
1、创建数据表:
 
create table t_SysMenu(
FMenuName  varchar(50)    not null ,
FMenuText  varchar(50)    not null ,
FMenuEvent  varchar(100)  ,
FMenuShortcutKeys varchar(50) null,
FMenuIcon  int default 0,
FMenuSequence  int default 0,
FParentNo  varchar(21) not null ,
FStatus    char(1) default '1',---
FFlag     char(1) default '1',---
FCreateDate             datetime  default getdate()   ,
FCreator           varchar(20) null  ,
FModifyDate             datetime  default getdate()   ,
FModifier           varchar(20) null  ,
FMemo               text null  ,
        constraint PK_t_SysMenu primary key(FMenuName)
)
go
 
 
2、插入数据:
 
MenuItemBase 基础资料(&B) NULL NULL 0
MenuItemBase_01 系统代码 MenuItemBase_01_Click NULL MenuItemBase
MenuItemHelp 帮助(&H) NULL NULL 0
MenuItemHelp_About 关于(&A) MenuItemHelp_About_Click NULL MenuItemHelp
MenuItemHelp_Cat 目录(&C) NULL F1 MenuItemHelp
 
 
二、新建项目-> Windows 用应用程序
1、界面如图aa:
拖入一菜单项MenuStrip并命名为sysMenu
 
 
2、代码段:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DBClassLib;
namespace SystemMenu
{
    public partial class Form1 : Form
    {
        private string strConnect = "user id=sa;password=; initial catalog=ERP;Server=huite-pc; Connect Timeout=30";
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                sysMenu.Items.Clear();
                SetMenu(sysMenu, "0");
            }
            catch
            {
                MessageBox.Show("创建菜单时出错", "出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="mMain">主菜单项</param>
        /// <param name="mName">主菜单项名称</param>
        private void SetMenu(MenuStrip mMain,string mName)
        {
            try
            {
                string strSql;
                int i;
                strSql = "SELECT * FROM t_SysMenu WHERE FStatus='1' And FParentNo='" + mName + "' Order by FMenuSequence";
                DBOperator db = DBOperator.GetDBOperator(strConnect);
                DataTable dt = new DataTable();
                db.Open();
                dt = db.GetDataTable(strSql);
                if (dt.Rows.Count > 0)
                {
                    for (i = 0; i < dt.Rows.Count; i++)
                    {
                        if (dt.Rows[i]["FParentNo"].ToString() == "0")
                        {
                            ToolStripMenuItem mItem;
                            mItem = new ToolStripMenuItem(dt.Rows[i]["FMenuText"].ToString());
                            mItem.Name = dt.Rows[i]["FMenuName"].ToString();
//                            mItem.Text = dt.Rows[i]["FMenuText"].ToString();
                            mMain.Items.Add(mItem);
                            SetSubMenu((ToolStripMenuItem)mMain.Items[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString());
                        }
                    }
                }
                db.Close();
            }
            catch
            {
                MessageBox.Show("创建主菜单时出错", "出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 创建子菜单
        /// </summary>
        /// <param name="mItem">要创建的子菜单的父项</param>
        /// <param name="mName">要创建的子菜单的父项名称</param>
        ///
        private void SetSubMenu( ToolStripMenuItem mItem,string mName)
        {
            try
            {
                string strSql;
                int i;
                //查询数据库
                strSql = "SELECT * FROM t_SysMenu WHERE FStatus='1' And FParentNo='" + mName + "' Order by FMenuSequence";
                DBOperator db = DBOperator.GetDBOperator(strConnect);
                DataTable dt = new DataTable();
                db.Open();
                dt = db.GetDataTable(strSql);
                for (i = 0; i < dt.Rows.Count; i++)
                {
                    if (dt.Rows[i]["FParentNo"].ToString() == mName)
                    {
                        ToolStripMenuItem mSubItem;
                        EventHandler eh=GetEvent(dt.Rows[i]["FMenuEvent"]); //获得操作事件
                        Keys key = GetShurtcutKeys(dt.Rows[i]["FMenuShortcutKeys"]);//获得快捷键
                       
                        //创建菜单项
                        mSubItem = new ToolStripMenuItem(dt.Rows[i]["FMenuText"].ToString(), imageList1.Images[(int)dt.Rows[i]["FMenuIcon"]],eh,key);
                        mSubItem.Name = dt.Rows[i]["FMenuName"].ToString();
                        //mSubItem.Text = dt.Rows[i]["FMenuText"].ToString();
                        mItem.DropDownItems.Add(mSubItem);
                        //设置子菜单
                        SetSubMenu((ToolStripMenuItem)mItem.DropDownItems[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString());
                    }
                }
                db.Close();
            }
            catch
            {
                MessageBox.Show("创建子菜单时出错", "出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// 取菜单事件
        /// </summary>
        /// <param name="mEvent">传入菜单事件对象</param>
        /// <returns>EventHandler事件句柄</returns>
        protected EventHandler GetEvent(object mEvent)
        {
            EventHandler eh;
            switch (mEvent.ToString())
            {
                case "MenuItemFile_Exit_Click"://退出程序
                    eh = new EventHandler(MenuItemFile_Exit_Click);
                    break;
                case "MenuItemFile_Print_Click"://窗口打印
                    eh = new EventHandler(MenuItemFile_Print_Click);
                    break;
                case "MenuItemWindow_Vertical_Click"://垂直排列窗口
                    eh = new EventHandler(MenuItemWindow_Vertical_Click);
                    break;
                case "MenuItemWindow_CloseAll_Click"://关闭所有子窗口
                    eh = new EventHandler(MenuItemWindow_CloseAll_Click);
                    break;
                case "MenuItemWindow_Cascade_Click"://重叠排列窗口
                    eh = new EventHandler(MenuItemWindow_Cascade_Click);
                    break;
                case "MenuItemWindow_Horizontal_Click"://窗口水平排列
                    eh = new EventHandler(MenuItemWindow_Horizontal_Click);
                    break;
                case "MenuItemHelp_About_Click"://关于窗口
                    eh = new EventHandler(MenuItemHelp_About_Click);
                    break;
                case "MenuItemBase_01_Click"://系统基本代码维护
                    eh = new EventHandler(MenuItemBase_01_Click);
                    break;
                default:
                    eh = new EventHandler(MenuItemNull_Click);
                    break;
            }
            return eh;
        }
        /// <summary>
        /// 获取操作快捷键
        /// </summary>
        /// <param name="mShurtcut"></param>
        /// <returns></returns>
        protected Keys GetShurtcutKeys(object mShurtcut)
        {
            Keys key;
            switch (mShurtcut.ToString())
            {
                case "CtrlA":
                    key = (Keys)Shortcut.CtrlA;
                    break;
                case "F1":
                    key = (Keys)Shortcut.F1;
                    break;
                default:
                    key = (Keys)Shortcut.None;
                    break;
            }
            return key;
       
        }

        /// <summary>
        /// 空事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void MenuItemNull_Click(object sender, EventArgs e)
        {
       
        }
        /// <summary>
        /// 退出程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MenuItemFile_Exit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
        /// <summary>
        /// 窗口打印
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MenuItemFile_Print_Click(object sender, EventArgs e)
        {
            MessageBox.Show("菜单事件", "响应", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        /// <summary>
        /// 垂直排列窗口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MenuItemWindow_Vertical_Click(object sender, EventArgs e)
        {
            LayoutMdi(MdiLayout.TileVertical);
        }
        /// <summary>
        /// 关闭所有子窗口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MenuItemWindow_CloseAll_Click(object sender, EventArgs e)
        {
            foreach (Form childForm in MdiChildren)
            {
                childForm.Close();
            }
        }
        /// <summary>
        /// 重叠排列窗口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MenuItemWindow_Cascade_Click(object sender, EventArgs e)
        {
            LayoutMdi(MdiLayout.Cascade);
        }
        /// <summary>
        /// 窗口水平排列
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MenuItemWindow_Horizontal_Click(object sender, EventArgs e)
        {
            LayoutMdi(MdiLayout.TileHorizontal);
        }
        /// <summary>
        /// 关于窗口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MenuItemHelp_About_Click(object sender, EventArgs e)
        {
        }

        /// <summary>
        /// 系统基本代码维护
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MenuItemBase_01_Click(object sender, EventArgs e)
        {
            //不重复打开窗口
            if (CheckChildForm("FormBaseCode") == false)
            {
                //打开窗口
            }
            else
            {
                //激活窗口
            }
        }
        /// <summary>
        /// 检测子窗口是否已打开
        /// </summary>
        /// <param name="childForm">子窗口名称</param>
        /// <returns>bool</returns>
        private bool CheckChildForm(string strChildForm)
        {
            bool isOpen = false;
            foreach (Form childForm in MdiChildren)
            {
                if (childForm.Name == strChildForm)
                {
                    isOpen = true;
                    break;
                }
            }
            return isOpen;
        }

    }