首先我們要有一個表里放入數據字段為: FORMID, FORMName,FormPranter,ExecForm幾個字段

    FormID    FormName   ExceForm   FormPranter

      1              XXXX        XXXX         0

      2              XXXX        XXXX         1

      3              XXXX        XXXX         2

      4              XXXX        XXXX         3

      5              XXXX        XXXX         0

  1.  

  2.  

  3. using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

  4.  #region"動態生成菜單"
            private void GetMenu(DataSet dstMenu)
            {
                this.IsMdiContainer = true;
                MenuStrip ms = new MenuStrip();
               
                for (int i = 0; i < dstMenu.Tables[0].Rows.Count;i++ )
                {
                    ToolStripMenuItem WindowMenu = new ToolStripMenuItem();
                    if (dstMenu.Tables[0].Rows[i]["FormPranter"].ToString() == "0" && dstMenu.Tables[0].Rows[i]["ExecForm"].ToString() == "")
                    {
                       WindowMenu.Text =dstMenu.Tables[0].Rows[i]["FormName"].ToString();
                       GetNextMenu(dstMenu, WindowMenu, dstMenu.Tables[0].Rows[i]["FormID"].ToString());
                    }
                    ms.Items.Add(WindowMenu);
                }
                this.Controls.Add(ms);
            }
            //传入菜单的DataSet 、当前的菜单项、当前菜单的ID
            //循环读出当前菜单项下的字菜单
            private ToolStripMenuItem GetNextMenu(DataSet dstMenu, ToolStripMenuItem PranterMenu, string FormID)
            {
                ToolStripMenuItem NextMenu = new ToolStripMenuItem();
                for (int i = 0; i < dstMenu.Tables[0].Rows.Count; i++)
                {
                   
                    if (dstMenu.Tables[0].Rows[i]["FormPranter"].ToString() == FormID && dstMenu.Tables[0].Rows[i]["ExecForm"].ToString() != "")
                    {
                        //为有Click的菜单添加事件
                        NextMenu = new ToolStripMenuItem(dstMenu.Tables[0].Rows[i]["FormName"].ToString(), null, new EventHandler(FieldMenu_Click));
                        //把菜单名控件的名命名为要执行的文件地址
                        NextMenu.Name = dstMenu.Tables[0].Rows[i]["ExecForm"].ToString();
                    }
                    //当菜单中没有Click事件时,则此菜单中可能存在子菜单
                    if (dstMenu.Tables[0].Rows[i]["FormPranter"].ToString() == FormID   && dstMenu.Tables[0].Rows[i]["ExecForm"].ToString() == "")
                    {
                       NextMenu = new ToolStripMenuItem(dstMenu.Tables[0].Rows[i]["FormName"].ToString());
                       //把菜单名控件的名命名为要执行的文件地址
                       NextMenu.Name = dstMenu.Tables[0].Rows[i]["ExecForm"].ToString();
                       //对可能存在的子菜单进行取值
                       GetNextMenu(dstMenu, NextMenu, dstMenu.Tables[0].Rows[i]["FormID"].ToString());
                    }
                    if (NextMenu.Text != "")
                    {
                        PranterMenu.DropDownItems.Add(NextMenu);
                    }
                }
                return PranterMenu;
            }
            //添加click事件
            private void FieldMenu_Click(object sender, EventArgs e)
            {
                //得到当前控件的相应属性
                string strFormName = ((ToolStripMenuItem)sender).Name.ToString();

  5.             //反射得到
                Type objType = Type.GetType(strFormName);
                object dObj = Activator.CreateInstance(objType);
                objType.InvokeMember("ShowDialog", System.Reflection.BindingFlags.InvokeMethod, null, dObj, null);

  6.         }

            #endregion

      

  

 

           

  1. InvokeMember 說明:     
  2. <PRE class=csharp name="code">Object InvokeMember (   
  3.     string name,   
  4.     BindingFlags invokeAttr,   
  5.     Binder binder,   
  6.     Object target,   
  7.     Object[] args,   
  8.     CultureInfo culture   
  9. )   
  10. <PRE class=csharp name="code">name   
  11. String,它包含要调用的构造函数、方法、属性或字段成员的名称。   
  12. - 或 -   
  13. 空字符串 (""),表示调用默认成员。   
  14. - 或 -   
  15. 对于 IDispatch 成员,一个表示 DispID 的字符串,例如“[DispID=3]”。   
  16. invokeAttr   
  17. 一个位屏蔽,由一个或多个指定搜索执行方式的 BindingFlags 组成。访问可以是 BindingFlags 之一,如 Public、NonPublic、Private、InvokeMethod 和 GetField 等。不需要指定查找类型。如果省略查找类型,则将应用 BindingFlags.Public |BindingFlags.Instance。 
  18. binder  
  19. 一个 Binder 对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、强制参数类型和通过反射调用成员。
  20. - 或 -     
  21. 若为 空引用(在 Visual Basic 中为 Nothing),则使用 DefaultBinder。
  22. target   
  23. 要在其上调用指定成员的 Object。   
  24. args   
  25. 包含传递给要调用的成员的参数的数组。   
  26. culture   
  27. 表示要使用的全局化区域设置的 CultureInfo 对象,它对区域设置特定的转换可能是必需的,比如将数字 String 转换为 Double。
  28. - 或 -   
  29. 空引用(在 Visual Basic 中为 Nothing),表示使用当前线程的 CultureInfo。    
  30. 返回值   
  31. 表示被调用成员的返回值的 Object。 
  32.  备注 
  33. 此方法用于从非托管代码访问托管类,不应从托管代码调用。   
  34. Type.InvokeMember 方法使用指定的绑定约束并匹配指定的参数列表和区域性,调用指定的成员。
  35. </PRE>   
  36. </PRE> 
posted on 2008-08-08 14:07  Blade  阅读(256)  评论(0编辑  收藏  举报