C# - ツリービューの構築
-
20-08-2019 - |
質問
メニューからツリービューを構築しようとしています。私のコードは次のようなものです:
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;
}
}
しかし、これは機能しません。
何が問題なのでしょうか?
解決
この方法には2つの問題があると思います。まずは、 MenuItemTraverse
方法。あなたは、 MenuItem
入力として。あなたは、 TreeNode
変数を作成し、新しい変数を割り当てます TreeNode
それの例です。次に、メニュー項目のサブ項目をループします。反復ごとに、サブ項目のテキストを TreeNode
(このメニューに表示されるメニュー項目のテキストが必要だと思います。 TreeNode
)。意図した動作を得るには、ループからこの行を削除する必要があります。
treeNode.Text = mi.Text;
...ループの前に次の行を追加します。
treeNode.Text = menuItem.Text;
まったく同じ問題が発生しているようです MenuTraverse
メソッドがあるので、そこで同じ変更を加えます。それで解決すると思います(コードはまだテストしていません。何かを見逃しているかもしれません)。
アップデート
ただし、コードをもう少し簡略化できると感じたので、少しだけ試してみた結果、これが私が思いついたものです。2 つの異なる方法を用意する代わりに、 MainMenu
そして 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 チェックなどを追加して少し「安定化」することをお勧めします。
他のヒント
ここにある...
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;
}