none
自動產生ToolStripMenuItem RRS feed

  • 問題

  • public partial class FrmContainer : Form { private List<MdiConfig> allConfig = new List<MdiConfig>(); public FrmContainer() { InitializeComponent(); } private void menuStripInit() { mspMenuStrip.Items.Clear(); if (allConfig.Count != 0) { foreach (MdiConfig eachCfg in allConfig) { if (eachCfg.ParentItemName == "") { mspMenuStrip.Items.Add(eachCfg.tsmiThisItem); } else { ((ToolStripMenuItem)mspMenuStrip.Items[eachCfg.ParentItemName]).DropDownItems.Add(eachCfg.tsmiThisItem);

    } } } } private void button1_Click(object sender, EventArgs e) { allConfig.Add(new MdiConfig("A1", "")); allConfig.Add(new MdiConfig("A2", "")); allConfig.Add(new MdiConfig("B1", "")); allConfig.Add(new MdiConfig("B2", "")); allConfig.Add(new MdiConfig("B3", "")); allConfig.Add(new MdiConfig("C1", "B1")); allConfig.Add(new MdiConfig("C2", "B1")); allConfig.Add(new MdiConfig("C3", "B1")); //allConfig.Add(new MdiConfig("D1", "C3")); //allConfig.Add(new MdiConfig("D2", "C3")); menuStripInit(); } } /// <summary> /// MDI Child Form Config /// </summary> public class MdiConfig { internal ToolStripMenuItem tsmiParenItem; internal ToolStripMenuItem tsmiThisItem; public string ThisGroupName; public string ThisItemName; public string ParentItemName; public MdiConfig( string thisItemName, string parentItemName) { ThisItemName = thisItemName; ParentItemName = parentItemName; tsmiParenItem = new ToolStripMenuItem(); tsmiThisItem = new ToolStripMenuItem(); tsmiParenItem.Name = parentItemName; tsmiParenItem.Text = parentItemName; tsmiThisItem.Name = thisItemName; tsmiThisItem.Text = thisItemName; } }

    只要在 allconfig中add定義好的mdiConfig即可利用menuStripInit把menu建立出來。

    我的問題是,以上寫法新增兩階層的menu是ok的,但是第三層就會掛掉,有什麼寫法可以改善這個問題嗎?


    • 已編輯 sbphsho 2012年8月30日 上午 11:25 字打錯
    2012年8月30日 上午 11:23

解答

  • 加第三層功能表的做法和第二層功能表的做法雷同, 先取得所加入的第二層功能表, 再加功能表在其DropDownItems集合, 就可以形成第三層功能表
    2012年9月1日 上午 03:05
  • http://www.codeproject.com/Articles/29997/Dynamic-Menu-Strip

    已經參考此篇,利用遞迴的方式產生menu,但是在AddChildMenuItems函式最後的程式需要作些改變。

    直接貼我的程式碼。

    //找出所有根目錄項目
    var queryResult = (from RootItems in allMdiMenuConfig
                       where RootItems.ParentItemName == null
                       select RootItems);
    
    //添加項目
    foreach (var item in queryResult)
    {
        // add the root item and check if it has any children 
        AddChildMenuItems(mspContainer.Items.Add(item.tsmiThisItem.Name));
    }
    
    
     private void AddChildMenuItems(ToolStripItem parent)
     {
         // Cast the Parent to a ToolStripMenuItem
         ToolStripMenuItem ParentItem = (ToolStripMenuItem)parent;
    
         //取得根目錄的名稱(第一個)
         string rootName = (from eachItem in allMdiMenuConfig
                            where eachItem.ThisItemName == ParentItem.Text
                            select eachItem.ThisItemName).First();
    
         //找出allMdiMenuConfig中ParentItemName和上述rootName相同的子項目
         var subItem = (from eachItem in allMdiMenuConfig
                        where eachItem.ParentItemName == rootName
                        select eachItem);
         
         //if there are any children
         if (subItem.Count() > 0)
         {
             foreach (var item in subItem)
             {
                 //如果該子項目是別人的父項目,將自己當作父項目遞迴
                 //找出所有項目中父項目名稱與此項目同名的item
                 var result = (from menuItem in allMdiMenuConfig
                               where menuItem.ParentItemName == item.tsmiThisItem.Name
                               select menuItem.tsmiThisItem);
                 
                 if (result.Count() <=0)
                 {
                     ParentItem.DropDownItems.Add(item.tsmiThisItem);
                 }
                 else
                 {
                     ParentItem.DropDownItems.Add(item.tsmiThisItem);
                     AddChildMenuItems(item.tsmiThisItem);
                 }
             }
         }
     }
    

    2012年9月3日 上午 12:43

所有回覆

  • 新增第一層的功能表後要取得新增的功能表, 第二層的功能表再加入到所取得的功能表底下:

    ToolStripMenuItem FirstLevel=null;

    if (eachCfg.ParentItemName == "")
    {
                FirstLevel=mspMenuStrip
    .Items.Add(eachCfg.tsmiThisItem);
    }
    else
    {
               
    FirstLevel.DropDownItems.Add(eachCfg.tsmiThisItem);

    }

    2012年8月31日 上午 03:09
  • 試了一下,是可以新增的,但是會加在第二層,無法像我原本的程式碼中可以指定父節點 Items[eachCfg.ParentItemName] 來add。
    上網找過其他資料,要先排序過,配合遞迴,不然就是要改變結構。我會再試試看。謝謝


    2012年9月1日 上午 12:52
  • 加第三層功能表的做法和第二層功能表的做法雷同, 先取得所加入的第二層功能表, 再加功能表在其DropDownItems集合, 就可以形成第三層功能表
    2012年9月1日 上午 03:05
  • http://www.codeproject.com/Articles/29997/Dynamic-Menu-Strip

    已經參考此篇,利用遞迴的方式產生menu,但是在AddChildMenuItems函式最後的程式需要作些改變。

    直接貼我的程式碼。

    //找出所有根目錄項目
    var queryResult = (from RootItems in allMdiMenuConfig
                       where RootItems.ParentItemName == null
                       select RootItems);
    
    //添加項目
    foreach (var item in queryResult)
    {
        // add the root item and check if it has any children 
        AddChildMenuItems(mspContainer.Items.Add(item.tsmiThisItem.Name));
    }
    
    
     private void AddChildMenuItems(ToolStripItem parent)
     {
         // Cast the Parent to a ToolStripMenuItem
         ToolStripMenuItem ParentItem = (ToolStripMenuItem)parent;
    
         //取得根目錄的名稱(第一個)
         string rootName = (from eachItem in allMdiMenuConfig
                            where eachItem.ThisItemName == ParentItem.Text
                            select eachItem.ThisItemName).First();
    
         //找出allMdiMenuConfig中ParentItemName和上述rootName相同的子項目
         var subItem = (from eachItem in allMdiMenuConfig
                        where eachItem.ParentItemName == rootName
                        select eachItem);
         
         //if there are any children
         if (subItem.Count() > 0)
         {
             foreach (var item in subItem)
             {
                 //如果該子項目是別人的父項目,將自己當作父項目遞迴
                 //找出所有項目中父項目名稱與此項目同名的item
                 var result = (from menuItem in allMdiMenuConfig
                               where menuItem.ParentItemName == item.tsmiThisItem.Name
                               select menuItem.tsmiThisItem);
                 
                 if (result.Count() <=0)
                 {
                     ParentItem.DropDownItems.Add(item.tsmiThisItem);
                 }
                 else
                 {
                     ParentItem.DropDownItems.Add(item.tsmiThisItem);
                     AddChildMenuItems(item.tsmiThisItem);
                 }
             }
         }
     }
    

    2012年9月3日 上午 12:43