ج# - TreeView البناء
-
20-08-2019 - |
سؤال
أنا أحاول بناء 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;
}