سؤال

أنا أحاول بناء 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 كما الإدخال.أنت تعلن 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 الضوابط مماثلة.

نصائح أخرى

ومن هنا ...

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