【问题标题】:List all database entries hierarchically分层列出所有数据库条目
【发布时间】:2013-10-05 15:58:15
【问题描述】:

我有一个类似的数据库:

| Element_ID               | Element_Parent                |  
|____________1_____________|_______________0_______________|  
|____________2_____________|_______________0_______________|  
|____________3_____________|_______________1_______________|  
|____________4_____________|_______________3_______________|  
|____________5_____________|_______________3_______________|  
|____________6_____________|_______________2_______________|  
|____________7_____________|_______________6_______________|  
|____________8_____________|_______________6_______________|  

其中 Element_Parent 指的是 Element_ID 列,0 表示该元素没有父元素。

我需要显示类似这样的数据库条目:

<ul>
    <li>
        1
        <ul>
            <li>
                3
                <ul>
                    <li>4</li>
                    <li>5</li>
                </ul>
            </li>
        </ul>
    </li>

    <li>
        2
        <ul>
            <li>
                6
                <ul>
                    <li>7</li>
                    <li>8</li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

我正在使用 DynamicRecords 访问数据库。

【问题讨论】:

  • 恐怕你的问题不是很清楚。向我们展示您已有的代码。作为一般提示,听起来您需要树结构。
  • 因为我使用的是 ASP.NET 网页而不是表单,所以我不确定如何实现树视图。除了身份验证之外,我唯一的代码是数据库连接 (var db = Database.Open("foobar"); ) 和 (var databaseData = db.Query("Select * From Elements"); )
  • 致任何查看此问题的人:我想出了一个使用 javascript 的解决方案。我会在 6 小时后发布解决方案(我没有足够的声誉)。

标签: c# asp.net sql asp.net-webpages


【解决方案1】:

如果您想要一个服务器端解决方案,您应该能够从我写的这篇关于在 ASP.NET 网页中使用递归的文章中获得一些有用的信息:http://www.mikesdotnetting.com/Article/208/Practical-Recursion-in-ASP.NET-Web-Pages-with-WebMatrix

但本质上,您需要一个类似这样的助手:

@helper  BuildTreeView(IEnumerable<dynamic> data, int? parentid = null, int level = 0) {
    var nodes = data.Where(n => n.ParentId == parentid).OrderBy(n => n.DisplayOrder);
    if (nodes.Any()) {
        if(nodes.First().ParentId != null){
            level++;
        }
        foreach (var node in nodes) {
            <div style="padding-left:@(level * 20)px;">
                @node.Text
            </div>
            @BuildTreeView(data, node.Id, level);
        }
    }
}

我添加了一个 DisplayOrder 列,以便您可以在数据库中添加和删除项目,并且仍然可以控制它们在各个节点中的显示顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2016-06-18
    相关资源
    最近更新 更多