0

メニューから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;
        }
    }

しかし、これは機能していません。

何が問題になる可能性がありますか?

4

2 に答える 2

1

方法には2つの問題があると思います。メソッドから始めましょうMenuItemTraverse。入力としてを取得MenuItemします。TreeNode変数を宣言し、それに新しいTreeNodeインスタンスを割り当てます。次に、メニュー項目のサブ項目をループします。反復ごとに、サブアイテムからのテキストをに割り当てますTreeNode(これに着信メニューアイテムのテキストが必要だと思いますTreeNode)。意図した動作を得るには、ループから次の行を削除する必要があります。

treeNode.Text = mi.Text;

...そしてループの前にこの行を追加します:

treeNode.Text = menuItem.Text;

メソッドにまったく同じ問題があるように見えるMenuTraverseので、そこで同じ変更を行います。私はそれがあなたのためにそれを解決すると思います(まだコードをテストしていません;何かを逃したかもしれません)。

アップデート

コードを少し簡略化できるのではないかと思ったので、少しだけ説明しました。これが私が思いついたものです。MainMenu入力のための2つの異なるメソッドを持つ代わりにMenuItem、これはプロセスを1つの単一のメソッドにカプセル化します。また、が必要です。これは、ツリーの任意のレベルで、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チェックなどを追加して少し「安定化」することをお勧めします。

于 2009-06-28T13:36:22.517 に答える
0

ここにあります...

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;
        }
于 2009-06-28T14:35:29.150 に答える