首先我們要有一個表里放入數據字段為: 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
-
-
-
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms; -
#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(); -
//反射得到
Type objType = Type.GetType(strFormName);
object dObj = Activator.CreateInstance(objType);
objType.InvokeMember("ShowDialog", System.Reflection.BindingFlags.InvokeMethod, null, dObj, null); -
}
#endregion
- InvokeMember 說明:
- <PRE class=csharp name="code">Object InvokeMember (
- string name,
- BindingFlags invokeAttr,
- Binder binder,
- Object target,
- Object[] args,
- CultureInfo culture
- )
- <PRE class=csharp name="code">name
- String,它包含要调用的构造函数、方法、属性或字段成员的名称。
- - 或 -
- 空字符串 (""),表示调用默认成员。
- - 或 -
- 对于 IDispatch 成员,一个表示 DispID 的字符串,例如“[DispID=3]”。
- invokeAttr
- 一个位屏蔽,由一个或多个指定搜索执行方式的 BindingFlags 组成。访问可以是 BindingFlags 之一,如 Public、NonPublic、Private、InvokeMethod 和 GetField 等。不需要指定查找类型。如果省略查找类型,则将应用 BindingFlags.Public |BindingFlags.Instance。
- binder
- 一个 Binder 对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、强制参数类型和通过反射调用成员。
- - 或 -
- 若为 空引用(在 Visual Basic 中为 Nothing),则使用 DefaultBinder。
- target
- 要在其上调用指定成员的 Object。
- args
- 包含传递给要调用的成员的参数的数组。
- culture
- 表示要使用的全局化区域设置的 CultureInfo 对象,它对区域设置特定的转换可能是必需的,比如将数字 String 转换为 Double。
- - 或 -
- 空引用(在 Visual Basic 中为 Nothing),表示使用当前线程的 CultureInfo。
- 返回值
- 表示被调用成员的返回值的 Object。
- 备注
- 此方法用于从非托管代码访问托管类,不应从托管代码调用。
- Type.InvokeMember 方法使用指定的绑定约束并匹配指定的参数列表和区域性,调用指定的成员。
- </PRE>
- </PRE>