递归地构建对象列表 [英] Recursively build a list of objects

查看:90
本文介绍了递归地构建对象列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嘿,伙计们,我需要帮助一些我想做的事情。基本上我想以递归方式构建菜单项列表。



所以我的菜单类如下



 简短 MenuId { get ;  set ;} 
string MenuName { get < /跨度>; set ;}
string 网址{ get < /跨度>; set ;}
short ParentmenuId { get set ;}
列表< menu> SubMenus { get ; set ;}
< / menu >





因此您可以看到每个菜单项可以有子菜单,我使用数据库中的所有菜单填充我的原始列表,所以我只是想知道如何遍历此列表构建菜单结构并将所有子菜单添加到属于每个父项的子菜单列表中。 br $> b $ b

我希望我很清楚。谢谢你们

解决方案

这里有两个不同类的菜单和菜单选择版本。您应该能够抓住整个块,将其移到表单中并运行它以便查看它的运行情况。



# region Examplebb  - 菜单
public static void Example4b()
{
using(Form form = new Form())
{
form.Menu = CreateMainMenu4b();
MenuParent parent = CreateMenuInfos4b();
foreach(parent.list中的MenuSelection信息)
{
BuildMenus4b(info,form.Menu,null);
}
form.ShowDialog();
}
}
private static MainMenu CreateMainMenu4b()
{
MainMenu menu = new MainMenu();
返回菜单;
}
private static MenuParent CreateMenuInfos4b()
{
EventHandler handler;

MenuParent parent = new MenuParent();
parent.list = new List< MenuSelection>();
/////// stuff
parent.list.Add(new MenuSelection(){MenuName =& Edit});
parent.list.Add(new MenuSelection(){MenuName =& Save,ClickHandler = SaveClick4b});
parent.list.Add(new MenuSelection(){MenuName =& Delete,ClickHandler = DeleteClick4b});
MenuSelection item = new MenuSelection();
parent.list.Add(item);
item.MenuName =& Secret;

//为其click事件添加一个使用此匿名委托的菜单项
handler = new EventHandler(delegate(object sender,EventArgs ev)
{
MessageBox .Show(Knock knock。谁在那里?Dunno ......);
});
item.SubMenus.Add(new MenuSelection(){MenuName =& Secret1,ClickHandler = handler});
item.SubMenus.Add(new MenuSelection(){MenuName =& Secret2,ClickHandler = delegate {MessageBox.Show(42);}});


parent.list.Add(new MenuSelection(){MenuName =& Name,ClickHandler = NameClick4b});
返回父母;
}
private static void NameClick4b(object sender,EventArgs e)
{
MenuItem mi = sender as MenuItem;
MessageBox.Show(我的名字是+ mi.Text);
}
私有静态无效SaveClick4b(对象发送者,EventArgs e)
{
MessageBox.Show(我好了!保存我!);
}
private static void DeleteClick4b(object sender,EventArgs e)
{
MessageBox.Show(我好像走了......!);
}
private static void BuildMenus4b(MenuSelection item,MainMenu menuControl,MenuItem menuItem)
{
MenuItem newItem = item.MakeMenuItem();
if(menuItem == null)
{
menuControl.MenuItems.Add(newItem);
}
else
{
menuItem.MenuItems.Add(newItem);
}
foreach(item.SubMenus中的MenuSelection thisItem)
{
BuildMenus4b(thisItem,menuControl,newItem);
}
}
公共类MenuParent
{
public List< MenuSelection> list = new List< MenuSelection>();
}
公共类MenuSelection
{
公共字符串MenuName {get;组; }
public List< MenuSelection> SubMenus {get;组; }
public EventHandler ClickHandler {get;组; }
public MenuSelection()
{
ClickHandler = null;
SubMenus = new List< MenuSelection>();
}
public MenuItem MakeMenuItem()
{
MenuItem item = new MenuItem(MenuName);
if(ClickHandler!= null)
item.Click + = new EventHandler(ClickHandler);
退货;
}
}
#endregion


也许这样的东西对你有用...... br $> b $ b

  public   class  MenuInfo 
{

public short MenuId {< span class =code-keyword> get ; set ; }
public string MenuName { get ; set ; }
public string 网址{ get ; set ; }
public short ParentmenuId { get ; set ; }
public 列表< menuinfo> SubMenus { get ; set ;}
public MenuItem MakeMenuItem()
{
MenuItem item = new MenuItem();
// 从属性中创建菜单项
return 项目;
}
}





这是你的递归方法:



  private   void  BuildMenus(MenuInfo item) ,MainMenu menuControl,MenuItem menuItem)
{
MenuItem newItem = item.MakeMenuItem();
if (menuItem == null
{
menuControl。 MenuItems.Add(的newitem);
}
else
{
menuItem.MenuItems.Add(newItem);
}
foreach (MenuInfo thisItem in item.SubMenus)
{
BuildMenus(thisItem,menuControl,newItem);
}
}





最初的电话:



  public   static   void  Example4()
{
使用(表格形式= new Form())
{
form.Menu = CreateMainMenu();
列表< MenuInfo> list = CreateMenuInfos();
foreach (MenuInfo info in list)
{
BuildMenus( info,form.Menu, null );
}
form.ShowDialog();
}
}


Hey Guys, I need a little help with something I am trying to do. Basically I want to recursively build a list of menu items.

So my Menu class is as follows

short MenuId {get; set;}
string MenuName { get; set;}
string Url {get; set;}
short ParentmenuId { get set;}
List<menu> SubMenus {get; set;}
</menu>



So as you can see each Menu item can have submenus, I populate my original list with all menus from the database, so I'm just wondering how to loop through this list building the menu structure and add all the submenus to the list of sub-menus belonging to each parent.

I hope I'm being clear. thanks guys

解决方案

Here's the version with two different classes for menu and menu selection. You should be able to just grab the whole block, past it into a form and run it in order to see it in action.

#region Example4b - Menu
public static void Example4b()
{
    using (Form form = new Form())
    {
        form.Menu = CreateMainMenu4b();
        MenuParent parent = CreateMenuInfos4b();
        foreach (MenuSelection info in parent.list)
        {
            BuildMenus4b(info, form.Menu, null);
        }
        form.ShowDialog();
    }
}
private static MainMenu CreateMainMenu4b()
{
    MainMenu menu = new MainMenu();
    return menu;
}
private static MenuParent CreateMenuInfos4b()
{
    EventHandler handler;

    MenuParent parent = new MenuParent();
    parent.list = new List<MenuSelection>();
    /////// stuff
    parent.list.Add(new MenuSelection() { MenuName = "&Edit" });
    parent.list.Add(new MenuSelection() { MenuName = "&Save", ClickHandler = SaveClick4b });
    parent.list.Add(new MenuSelection() { MenuName = "&Delete", ClickHandler = DeleteClick4b });
    MenuSelection item = new MenuSelection();
    parent.list.Add(item);
    item.MenuName = "&Secret";

    // add a menu item that uses this anonymous delegate for its click event
    handler = new EventHandler(delegate(object sender, EventArgs ev)
    {
        MessageBox.Show("Knock knock.  Who's there?  Dunno...");
    });
    item.SubMenus.Add(new MenuSelection() { MenuName = "&Secret1", ClickHandler = handler });
    item.SubMenus.Add(new MenuSelection() { MenuName = "&Secret2", ClickHandler = delegate { MessageBox.Show("42"); } });


    parent.list.Add(new MenuSelection() { MenuName = "&Name", ClickHandler = NameClick4b });
    return parent;
}
private static void NameClick4b(object sender, EventArgs e)
{
    MenuItem mi = sender as MenuItem;
    MessageBox.Show("My name is " + mi.Text);
}
private static void SaveClick4b(object sender, EventArgs e)
{
    MessageBox.Show("I benn clikked!  Save me!");
}
private static void DeleteClick4b(object sender, EventArgs e)
{
    MessageBox.Show("I'm so gone...!");
}
private static void BuildMenus4b(MenuSelection item, MainMenu menuControl, MenuItem menuItem)
{
    MenuItem newItem = item.MakeMenuItem();
    if (menuItem == null)
    {
        menuControl.MenuItems.Add(newItem);
    }
    else
    {
        menuItem.MenuItems.Add(newItem);
    }
    foreach (MenuSelection thisItem in item.SubMenus)
    {
        BuildMenus4b(thisItem, menuControl, newItem);
    }
}
public class MenuParent
{
    public List<MenuSelection> list = new List<MenuSelection>();
}
public class MenuSelection
{
    public string MenuName { get; set; }
    public List<MenuSelection> SubMenus { get; set; }
    public EventHandler ClickHandler { get; set; }
    public MenuSelection()
    {
        ClickHandler = null;
        SubMenus = new List<MenuSelection>();
    }
    public MenuItem MakeMenuItem()
    {
        MenuItem item = new MenuItem(MenuName);
        if (ClickHandler != null)
            item.Click += new EventHandler(ClickHandler);
        return item;
    }
}
#endregion


Maybe something like this would work for you...

public class MenuInfo
{

    public short MenuId { get; set; }
    public string MenuName { get; set; }
    public string Url { get; set; }
    public short ParentmenuId { get; set; }
    public List<menuinfo> SubMenus {get; set;}
    public MenuItem MakeMenuItem()
    {
        MenuItem item = new MenuItem();
        // make your menu item here from properties
        return item;
    }
}



Here's your recursive method:

private void BuildMenus(MenuInfo item, MainMenu menuControl, MenuItem menuItem)
{
    MenuItem newItem = item.MakeMenuItem();
    if (menuItem == null)
    {
        menuControl.MenuItems.Add(newItem);
    }
    else
    {
        menuItem.MenuItems.Add(newItem);
    }
    foreach (MenuInfo thisItem in item.SubMenus)
    {
        BuildMenus(thisItem, menuControl, newItem);
    }
}



And the initial call:

public static void Example4()
{
    using (Form form = new Form())
    {
        form.Menu = CreateMainMenu();
        List<MenuInfo> list = CreateMenuInfos();
        foreach (MenuInfo info in list)
        {
            BuildMenus(info, form.Menu, null);
        }
        form.ShowDialog();
    }
}


这篇关于递归地构建对象列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆