C#将ToolStripMenueItems动态添加到MenuStrip

时间:2009-10-12 18:18:03

标签: winforms c#-2.0 toolstrip

我想知道是否可以帮助简化某些逻辑。我有一个Windows窗体(C#2.0),其中包含一个System.Windows.Forms.MenuStrip。

  1. 我想动态添加 ToolStripMenueItems到 MenuStrip中。添加的项目将是 驱逐出数据库(但对于 简单性我删除了那部分 来自下面的代码)。
  2. 我希望能够建立 复杂菜单(即工具>数学> Calc, 帮助>文档,帮助>关于, 格式>&编码GT;西部, 格式>编码>其他>希腊)
  3. 以下代码似乎有效,但您如何才能使loadToolbars()更高效/更简单?

    这是我需要帮助的功能:

    void loadToolbars()
    {
        foreach(Toolbar t in getToolStripItems())
        {
            string[] toolPath = t.toolbar.Split(">".ToCharArray(),StringSplitOptions.RemoveEmptyEntries);
            ToolStripMenuItem root = null;
            ToolStripItem[] foundItems;
    
            /*
             * follow the path of each Toolbar item.  If we find a dead-end,
             * add the missing part
             */
            for(int i=0; i<toolPath.Length; i++)
            {
                if(root == null)
                {
                    //Search the main menu strip (System.Windows.Forms.MenuStrip)
                    foundItems = DA_Menu.Items.Find(toolPath[i],false);
                }else
                {
                    //Continue searching were we left off
                    foundItems = root.DropDownItems.Find(toolPath[i],false);
                }
    
                if(foundItems.Length>0)
                {
                    foreach(ToolStripItem item in foundItems)
                    {
                        //Is this the Toolbar item I am looking for?
                        if(item.Text == toolPath[i])
                        {
                            if(item.OwnerItem != null && i>0)
                            {
                                if((item.OwnerItem.Text == toolPath[i-1]) 
                                    && (item.Text == toolPath[i]))
                                    root = (ToolStripMenuItem)item;
                            }else
                            {
                                root = (ToolStripMenuItem)item;
                            }
                        }
                    }
                }else
                {
                    //We hit a dead-end.  Add the missing path
                    if(root == null)
                    {
                        root = new ToolStripMenuItem(toolPath[i]);
                        root.Name = toolPath[i];
                        DA_Menu.Items.Add(root);
                    }else
                    {
                        ToolStripMenuItem tsmi = new ToolStripMenuItem(toolPath[i]);
                        tsmi.Name = toolPath[i];
                        root.DropDownItems.Add(tsmi);
                        root = tsmi;
                    }
                }
            }
    
            //Add the Toobar item to the path that was built above
            t.Click +=new EventHandler(Toolbar_Click);
            ((ToolStripMenuItem)root).DropDownItems.Add(t);
        }
    }
    

    下面的内容,我很高兴,但我正在提供它,以帮助其他人遵循我正在做的事情。

    此功能是数据驱动的,但是为了SO的好处而进行了硬编码

    private List<Toolbar> getToolStripItems()
    {
       List<Toolbar>toolbars = new List<Toolbar>();
    
       Toolbar t = new Toolbar();
       t.Text = "Calc";
       t.path = "c:\windows\system32\calc.exe";
       t.toolbar = "Tools>Microsoft>Math";
    
       toolbars.Add(t);
    
       t = new Toolbar()
       t.Text = "Calc2";
       t.path = "c:\windows\system32\calc.exe";
       t.toolbar = "Tools>Math>Microsoft";
    
       toolbars.Add(t);
    
       return toolbars;
    }
    

    自定义类有助于简化点击事件

    class Toolbar:ToolStripMenuItem
    {
        public string path;
        public string toolbar;
        public Toolbar()
        {
            /*
             * Set the name to the Text value
             * so that it can be found in collection
             * by key
             */
            base.Name = Text;
        }
    }
    

    所有工具栏项目点击事件将在此功能中处理

    void Toolbar_Click(object sender, EventArgs e)
    {
        //Get the Toolbar item that was clicked
        Toolbar t = (Toolbar)sender;
    
        //Start new process
        System.Diagnostics.Process p = new System.Diagnostics.Process();
        p.StartInfo.FileName = t.path;
        p.Start();
    }
    

1 个答案:

答案 0 :(得分:1)

问题在于您的数据所处的形式。如果您坚持使用该表单,我认为没有太多事情要做。

否则,将您的数据从像“工具&gt; Microsoft&gt; Math”这样的平面字段结构更改为类似TreeList的数据,例如包含Microsoft列表的工具列表,其中包括包含您的应用程序条目的Math列表。您甚至可以在数据库中构建该结构。

然后,您可以轻松地递归添加菜单项。