在asp.net中递归显示子对象

时间:2011-07-15 19:48:47

标签: asp.net listview recursion treeview

我的项目有一些“MyObject”,MyObject的属性为List<MyObject>。我想构建一个简单的HTML嵌套无序列表来显示任何指定的MyObject的层次结构。一些问题:

1)孩子的总深度未知。

2)我希望能够将深度限制为X个孩子。

3)列表项需要能够包含任何有效的HTML,最好是asp.net控件,例如一个LinkBut​​ton

处理此问题的最佳方法是什么?的TreeView?嵌套ListViews?我们非常感谢示例代码或教程链接。

2 个答案:

答案 0 :(得分:2)

您的第三个问题仍然不明确,但以下内容应该让您前进。它使用递归函数来读取对象及其子对象。在此示例中,属性将添加到简单的项目符号列表中,但可以在其他情况下轻松修改。

    public class MyObject
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public List<MyObject> Children { get; set; }
    }

    public void BuildTree(MyObject obj)
    {
        lit.Text += "<ul>";
        lit.Text += "<li>" + obj.Name + "- Age: " + obj.Age + "</li>";
        if (obj.Children != null)
        {
            foreach (MyObject objChild in obj.Children)
            {
                BuildTree(objChild);
            }
        }
        lit.Text += "</ul>";
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        MyObject child1 = new MyObject { Name = "Joe", Age = 7 };
        MyObject child2 = new MyObject { Name = "Sally", Age = 6 };
        List<MyObject> children = new List<MyObject>();
        children.Add(child1);
        children.Add(child2);
        MyObject parent1 = new MyObject { Name = "Roger", Age = 36, Children = children };
        BuildTree(parent1);
    }

答案 1 :(得分:1)

你可以像那样使用TreeView

public static int maxDepth = 5;
public class MyObject
{
    public string Text;
    public string Value;
    public List<MyObject> Children;

    public MyObject(string text, string value)
    {
        Text = text;
        Value = value;
        Children = new List<MyObject>();
    }
    public MyObject(string text)
    {
        Text = text;
        Value = text;
        Children = new List<MyObject>();
    }
    public void AddToNode(TreeNode node, int depth)
    {
        TreeNode subNode = new TreeNode(Text, Value);
        node.ChildNodes.Add(subNode);
        if (depth < maxDepth)
        {
            for (int i = 0; i < Children.Count; i++)
            {
                Children[i].AddToNode(subNode, depth + 1);
            }
        }
    }
}
protected void Page_Load(object sender, EventArgs e)
{
    MyObject myObject;

    myObject = new MyObject("obj 1");
    myObject.Children.Add(new MyObject("obj 1.1"));
    myObject.Children.Add(new MyObject("obj 1.2"));
    myObject.Children[0].Children.Add(new MyObject("obj 1.1.1"));
    myObject.Children[0].Children.Add(new MyObject("obj 1.1.2"));
    myObject.Children[1].Children.Add(new MyObject("obj 1.2.1"));
    myObject.Children[1].Children.Add(new MyObject("obj 1.2.2"));

    treeView.Nodes.Add(new TreeNode("Root", "root"));
    myObject.AddToNode(treeView.Nodes[0], 0);
}