Я думаю, что есть две проблемы в методах. Давайте начнем с метода MenuItemTraverse
. Вы получаете MenuItem
в качестве ввода. Вы объявляете переменную TreeNode
и назначаете ей новый экземпляр TreeNode
. Затем вы перебираете подпункты пункта меню. Для каждой итерации вы присваиваете текст из подпункта на TreeNode
(я бы предположил, что вы захотите, чтобы текст входящего пункта меню на этом TreeNode
). Чтобы получить намеченное поведение, вы должны удалить эту строку из цикла:
treeNode.Text = mi.Text;
... и добавьте эту строку перед циклом:
treeNode.Text = menuItem.Text;
Похоже, у вас точно такая же проблема в методе MenuTraverse
, поэтому сделайте то же самое там. Я думаю, это решило бы это для вас (пока не тестировал код; возможно, что-то пропустил).
Обновление
Я немного рассказал об этом, поскольку чувствовал, что код, возможно, можно немного упростить, и это то, что я придумал. Вместо двух разных методов для ввода MainMenu
и MenuItem
, этот инкапсулирует процесс в один метод. Кроме того, требуется TreeNodeCollection
, что означает, что вы можете использовать метод для вставки структуры меню в уже существующий (и заполненный) элемент управления TreeView
на любом уровне дерева.
public class MenuExtractionUtility
{
public static void MenuItemTraverse(TreeNodeCollection parentCollection, Menu.MenuItemCollection menuItems)
{
foreach (MenuItem mi in menuItems)
{
System.Diagnostics.Debug.WriteLine(mi.Text);
TreeNode menuItemNode = parentCollection.Add(mi.Text);
if (mi.MenuItems.Count > 0)
{
MenuItemTraverse(menuItemNode.Nodes, mi.MenuItems);
}
}
}
}
Пример использования:
treeView1.Nodes.Clear();
MenuExtractionUtility.MenuItemTraverse(treeView1.Nodes, mainMenu1.MenuItems);
Этот код был просто быстро составлен, так что вы можете немного «стабилизировать» его, добавив нулевые проверки и тому подобное.