比如菜单名是menuitem1,在Form_Load中下面这样不行,该怎么写?MenuItem mi=this.Menu.MenuItems["menuitem1"];  //报错行
mi.PerformClick()

解决方案 »

  1.   

    this.Menu   ---->  MENU 是ID 名嗎?
      

  2.   

    好像MENU沒有繼承IDictionary接口,所以這樣就不行的.
      

  3.   

    要自己写代码处理吧,可能 private void button2_Click(object sender, System.EventArgs e)
    {
    MenuItem mi=GetMenuItemByMenuText("File"); 
    if (mi != null)
    mi.PerformClick();
    } private MenuItem GetMenuItemByMenuText(string menuText)
    {
    foreach (MenuItem mi in this.Menu.MenuItems)
    {
    if (mi.Text == menuText)
    return mi;
    }
    return null;
    }
      

  4.   

    试了一下,即使象我上面那样做,foreach得到的也只是当前Form所拥有的最近一级子菜单,如果再下一级又不行了 ,再下一级的话要么用递归,要么直接指定要查找菜单的父菜单,感觉和TreeView中的节点的层级关系很类似,不好用:(
      

  5.   

    谢谢各位的回答。looner(漫漫求学路) 大侠说的是根据Text查找菜单。但是我期望的是根据设计菜单时定义的Name查找菜单,不知道可不可以?(MenuItem 没有Name属性)
      

  6.   

    用反射搞定了 private void button2_Click(object sender, System.EventArgs e)
    {
    System.Reflection.FieldInfo fi = this.GetType().GetField("menuItem1");
    if (fi != null)
    {
    MenuItem mi = fi.GetValue(this) as MenuItem;
    if (mi != null)
    mi.PerformClick();
    }
    }
      

  7.   

    忘了重要一句,一定要将menuItem1的private类型改为public类型,否则找不到!!!
      

  8.   

    按上面的意思稍做修改:System.Reflection.FieldInfo fi=this.GetType().GetField("menuItem3",System.Reflection.BindingFlags.NonPublic|System.Reflection.BindingFlags.Instance);
    if(fi!=null)
    {
    MenuItem mi=fi.GetValue(this) as MenuItem;
    mi.PerformClick();
    }
      

  9.   

    VS2005NET:System.Reflection.FieldInfo fi = this.GetType().GetField("菜单名称");
                    if (fi != null)
                    {
                        ToolStripMenuItem mi = fi.GetValue(this) as ToolStripMenuItem;
                        if (mi != null)
                            mi.Enabled = false;
                    }