문제

메뉴에서 TreeView를 구성하려고합니다. 내 코드는 다음과 같습니다.

public class MenuExtractionUtility
    {
        public TreeView MenuTraverse(MainMenu mainMenu)
        {
            TreeView treeView = new TreeView();

            TreeNode mainNode = new TreeNode();

            foreach (MenuItem mi in mainMenu.MenuItems)
            {
                System.Diagnostics.Debug.WriteLine(mi.Text);

                mainNode.Text = mi.Text;

                TreeNode tn = MenuItemTraverse(mi);

                mainNode.Nodes.Add(tn);
            }

            treeView.Nodes.Add(mainNode);

            return treeView;
        }

        private TreeNode MenuItemTraverse(MenuItem menuItem)
        {
            TreeNode treeNode = new TreeNode();

            foreach(MenuItem mi in menuItem.MenuItems)
            {
                System.Diagnostics.Debug.WriteLine(mi.Text);

                treeNode.Text = mi.Text;

                TreeNode tr = MenuItemTraverse(mi);

                if (tr!=null && tr.Text != "")
                {
                    treeNode.Nodes.Add(tr);
                }
            }

            return treeNode;
        }
    }

그러나 이것은 작동하지 않습니다.

문제는 무엇입니까?

도움이 되었습니까?

해결책

이 방법에는 두 가지 문제가 있다고 생각합니다. 시작하자 MenuItemTraverse 방법. 당신은 얻는다 MenuItem 입력으로. 당신은 a 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);

이 코드는 신속하게 정리되었으므로 Null Checks 및 이와 유사하게 추가하여 약간의 "안정화"를 원할 수 있습니다.

다른 팁

여기있어...

public class MenuExtractionUtility
    {
        public void MenuTraverse(MainMenu mainMenu, TreeView treeView)
        {
            TreeNode ultimateMainNode = new TreeNode();
            ultimateMainNode.Text = "Root";

            TreeNode mainNode = null;

            foreach (MenuItem mi in mainMenu.MenuItems)
            {
                if (mi != null && mi.Text != "")
                {
                    mainNode = null;

                    if (mi.MenuItems.Count <= 0)
                    {
                        mainNode = new TreeNode();
                        mainNode.Text = mi.Text;
                    }
                    else if (mi.MenuItems.Count > 0)
                    {
                        mainNode = MenuItemTraverse(mi);
                    }

                    ultimateMainNode.Nodes.Add(mainNode);
                }
            }

            treeView.Nodes.Add(ultimateMainNode);
        }

        private TreeNode MenuItemTraverse(MenuItem menuItem)
        {
            TreeNode treeNode = new TreeNode();
            System.Diagnostics.Debug.Write(menuItem.Text+",");
            treeNode.Text = menuItem.Text;

            foreach (MenuItem mi in menuItem.MenuItems)
            {
                if (mi != null && mi.Text != "")
                {
                    TreeNode tr = MenuItemTraverse(mi);

                    if (tr != null && tr.Text != "")
                    {
                        treeNode.Nodes.Add(tr);
                    }
                }
            }

            return treeNode;
        }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top