下面的示例创建一个 MainMenu,向 MainMenu 分配两个 MenuItem 对象,并将它绑定到一个窗体上。此示例假定已经创建名为 Form1 的 Form。
[Visual Basic] 
Public Sub CreateMyMainMenu()
    ' Create an empty MainMenu.
    Dim mainMenu1 As New MainMenu()
       
    Dim menuItem1 As New MenuItem()
    Dim menuItem2 As New MenuItem()
       
    menuItem1.Text = "File"
    menuItem2.Text = "Edit"
    ' Add two MenuItem objects to the MainMenu.
    mainMenu1.MenuItems.Add(menuItem1)
    mainMenu1.MenuItems.Add(menuItem2)
       
    ' Bind the MainMenu to Form1.
    Menu = mainMenu1
End Sub
[C#] 
public void CreateMyMainMenu()
{
   // Create an empty MainMenu.
   MainMenu mainMenu1 = new MainMenu();   MenuItem menuItem1 = new MenuItem();
   MenuItem menuItem2 = new MenuItem();   menuItem1.Text = "File";
   menuItem2.Text = "Edit";
   // Add two MenuItem objects to the MainMenu.
   mainMenu1.MenuItems.Add(menuItem1);
   mainMenu1.MenuItems.Add(menuItem2);
   
   // Bind the MainMenu to Form1.
   Menu = mainMenu1;   
}

解决方案 »

  1.   

    for(int i=0;i<this.main_menu.MenuItems.Count;i++)
    {
         shangjcdmc=this.main_menu.MenuItems[i].Text;
         for(int b=0;b<this.main_menu.MenuItems[i].MenuItems.Count;b++)
         {
    //menutext
    menutext=this.main_menu.MenuItems[i].MenuItems[b].Text;
          }
    }
    利用这个读取每个菜单,然后与较数据库中菜单比较,在利用this.main_menu.MenuItems[i].MenuItems[b].visible属性控制它是否可见。就行了。
      

  2.   

    foreach (System.Data.DataRow drItem in menus.Rows )
    {
    myMenuItem mnuItem=new myMenuItem ();
             mnuItem.Path = drItem["MenuPath"].ToString ();
    mnuItem.MenuName  = drItem["MenuName"].ToString ();
    mnuItem.Text  = drItem["Text"].ToString ();
    mnuItem.Description   = drItem["Description"].ToString ();
    mnuItem.Checked  = System.Convert.ToBoolean (drItem["Checked"]);
             ...
    mnuItem.Visible   = System.Convert.ToBoolean (drItem["Visible"]);
    mnuItem.ShowDialog   = System.Convert.ToBoolean  (drItem["ShowDialog"]);
             mnuItem.Call    = drItem["Call"].ToString ();          //据字符串进行功能调用
    mnuItem.Click +=new EventHandler(mnuItem_Click);
    mnuItem.Select+=new EventHandler(mnuItem_Select);
    mnuItem.Args =eval.Evaluate (mnuItem.MenuName ) as object []; //调用参数
             AddMenuItem(mnuItem.Path.Split ('.'),mnuItem);         //据菜单路径添加到主菜单
    }private void mnuItem_Click(object sender, EventArgs e)
    {
             myMenuItem mnu=(sender as myMenuItem );
             Call(mnu.Name,mnu.Call,mnu.Args);                  //所有菜单集中到这里调用
    }
    private void mnuItem_Select(object sender, EventArgs e)
    {
             myMenuItem mnu=(sender as myMenuItem );
             this.statusBar1.Panels [0].Text  =mnu.Description ;
    }
      

  3.   

    上面的代码需要你自己派生一个myMenuItem,扩展几个属性
    这样你可以加载菜单并进行所有设置,并集中处理
    如果不能做到将菜单要调用的功能和参数也放在数据库里的话,
    那当然可在mnuItem_Click事件中用switch (mnu.Name)解决偶在数据表保存菜单的格式:
    MenuPath:   00.09.02        //是各级的索引来的
    Name和Text: 报价成本分析    //多数情况下是相同的
    ....                        //简单的略了
    Call:  程序集名\命名空间\<public >(Void) frm报价单()  //后面的是一个类的构造函数,这可以通过反射自动生成来填写此栏,当然也可用反射结合参数一起调用.
    Args:  //这一栏内容就是一个C#的数组声明,例如:new object[] {"ds报价单",1,new string [] {"ds报价单.报价单","ds报价单.报价单明细",".交易方式",".送货方式",".加工类别",".单位",".客户资料"},""} (偶的报价单的一个构造函数需要传入数据集名和使用到的表名)
      

  4.   

    MenuPath:   00.09.02        //是各级的索引来的文件(00)            编辑(01)            XX02    
    新建(00)
    打开(01)
    ..
    导出(09)
        导出为Excel(01)
        导出为Text (02)