利用风骚小递归遍历MenuStrip获取TreeView中的TreeNode项

利用风骚小递归遍历MenuStrip获取TreeView中的TreeNode项_第1张图片

上图为“明日科技”项目书上的一人事管理系统的开源项目需求:将上方MenuStrip中的项按照层次加到TreeNode中。以下是书中所给出的源代码:

public void GetMenu(TreeView treeV, MenuStrip MenuS)
{
   for (int i = 0; i < MenuS.Items.Count; i++) //遍历MenuStrip组件中的一级菜单项
   {
       //将一级菜单项的名称添加到TreeView组件的根节点中,并设置当前节点的子节点newNode1
       TreeNode newNode1 = treeV.Nodes.Add(MenuS.Items[i].Text);
       //将当前菜单项的所有相关信息存入到ToolStripDropDownItem对象中
       ToolStripDropDownItem newmenu = (ToolStripDropDownItem)MenuS.Items[i];
       //判断当前菜单项中是否有二级菜单项
       if (newmenu.HasDropDownItems && newmenu.DropDownItems.Count > 0)
           for (int j = 0; j < newmenu.DropDownItems.Count; j++)    //遍历二级菜单项
           {
               //将二级菜单名称添加到TreeView组件的子节点newNode1中,并设置当前节点的子节点newNode2
               TreeNode newNode2 = newNode1.Nodes.Add(newmenu.DropDownItems[j].Text);
               //将当前菜单项的所有相关信息存入到ToolStripDropDownItem对象中
               ToolStripDropDownItem newmenu2 = (ToolStripDropDownItem)newmenu.DropDownItems[j];
               //判断二级菜单项中是否有三级菜单项
               if (newmenu2.HasDropDownItems && newmenu2.DropDownItems.Count > 0)
                   for (int p = 0; p < newmenu2.DropDownItems.Count; p++)    //遍历三级菜单项
                       //将三级菜单名称添加到TreeView组件的子节点newNode2中
                       newNode2.Nodes.Add(newmenu2.DropDownItems[p].Text);
           }
   }
}

其在主窗体的Load事件下,写死了三层的for循环,第一层添加的是menu.Item.Text,第二,三层添加DropDownItem.Text。这样的循环具有比较差的灵活性,如果第三层再往下加一层,将面临着修改代码,再写一层for循环。且语言繁杂不容易看出。

这里将其简化,简化成比较简单的,递归形式的循环来获取TreeNode项:

public static void GetMenu(TreeView treeV, MenuStrip menuS)
{ 
   //遍历menuStrip中的一级菜单项
   foreach (ToolStripDropDownItem m1 in menuS.Items)
   {
       //循环添加一级菜单
       TreeNode node1 = treeV.Nodes.Add(m1.Text);
       GetMenu(node1, m1);
   }
}

private static void GetMenu(TreeNode node1, ToolStripDropDownItem m1)
{
   foreach (ToolStripDropDownItem m2 in m1.DropDownItems)
   {
       if (m2 != null)
       {
           TreeNode node2 = node1.Nodes.Add(m2.Text);
           GetMenu(node2, m2);//风骚小递归
       }
   }
}

重载了两个参的GetMenu。
上方的过程是第一层循环,传入TreeView , menuS.Items,TreeNode添加的是ToolStripDropDownItem.Text
下方传入的是TreeNode , ToolStripDropDownItem,TreeNode添加的仍然是ToolStripDropDownItem.Text
在第二个循环处先判空,不空则递归添加子节点。体现了循环添加TreeNode控件的灵活性

你可能感兴趣的:(c#)