1

我目前正在使用这个http://blogs.sitepoint.com/hierarchical-data-database-2/方法来存储我的数据。

我当前的数据库行如下所示:

姓名 | 节点左 | 节点右 | 节点级别

主页 | 1 | 6 | 1

内容A | 2 | 5 | 2

内容B | 3 | 4 | 2

关于 | 7 | 8 | 1

现在我使用 ASP.NET 中继器使用列表和 jsTree 输出数据:

<asp:Repeater ID="rptContentSectionGetAll" runat="server">
        <HeaderTemplate>
            <div id="contentSectionTree">
                <ul>
                    <li id="contentSectionTreeRoot" rel="root"><a href="#">Root</a>
                        <ul>
        </HeaderTemplate>
        <ItemTemplate>
                            <li id='<%# Eval("ID") %>'>
                                <a href="#"><%# Eval("name") %></a>
                            </li>

        </ItemTemplate>
        <FooterTemplate>
                        </ul>
                    </li>
                </ul>
            </div>
        </FooterTemplate>
 </asp:Repeater>

我需要从后面的代码ItemTemplate中用 all<li>和 nested替换里面的内容。<ul>

这是我当前的代码:

private DataTable RepeaterDataSource()
    {
        ContentSectionBAL cBAL = new ContentSectionBAL(); 
        DataTable dTable = new DataTable();
        try
        {
            dTable = cBAL.Load();

            int counter = 1;
            var htmlList = "";
            for (int i = 0; i < dTable.Rows.Count; i++)
            {
                htmlList = "<li rel='folder' id='" + dTable.Rows[i]["ID"] + "'>";
                htmlList += "<a href='#'>" + dTable.Rows[i]["name"] + "</a>";

                if (Convert.ToInt32(dTable.Rows[i]["nodeLevel"]) > counter)
                {
                    htmlList = "<ul>";
                    for (int j = 0; j < dTable.Rows.Count; j++)
                    {
                        if (Convert.ToInt32(dTable.Rows[i]["nodeLevel"]) > counter + 1)
                        {
                            htmlList += "<li rel='file' id='" + dTable.Rows[j]["ID"] + "'>";
                            htmlList += "<a href='#'>" + dTable.Rows[j]["name"] + "</a>";
                            htmlList += "</li>";
                        }
                    }
                    htmlList += "</ul>";
                }

                htmlList += "</li>";
                counter = counter + 1;
            }
        }
        catch (Exception ee)
        {
            Session["message"] = ee.Message.ToString();
            Session["messageType"] = "error";
        }

        return dTable;
    }

在这个函数之后不久,我通过执行以下操作来绑定它:

private void BindRepeater()
    {
        rptContentSectionGetAll.DataSource = RepeaterDataSource();
        rptContentSectionGetAll.DataBind();
    }

所有没有子节点的常规节点输出:<li>name</li> 所有有子节点的节点都需要在某种循环中输出它的所有子节点: <li><ul><li></li></ul><li>

我的问题: 1. 循环这种类型的数据以获得正确输出的正确方法是什么?2. 如何在中继器中成功输出?[回答]

我知道我所拥有的一切都行不通,但我的大脑开始思考这一切。任何帮助将不胜感激。

如果您需要其他任何东西,请告诉我,但这应该是它。

来吧伙计们,我需要条件或数学方面的帮助才能以正确的顺序获取我想要的东西。

4

3 回答 3

1

我们使用 OnItemDataBound 事件来呈现您的代码。将您的项目模板的内容替换为

<ItemTemplate>       
    <asp:Literal ID="Literal1" runat="server"></asp:Literal>
</ItemTemplate> 

然后在您的 ItemDataBound 事件处理程序中构建您想要作为字符串的结构并将其分配给文字 Text 属性。

((Literal)e.Item.FindControl("Literal1")).Text = MyNewStructureString;
于 2011-04-20T15:10:44.357 回答
1

您可以使用嵌套中继器并避免编写所有代码来输出内部 ul。只要您需要的列表是外部转发器的数据项对象的属性,您就可以在转发器内以声明方式设置转发器的数据源。

如果这是不可能的,因为对象不是以这种方式构造的,您仍然可以使用嵌套转发器方法,只需在 ItemDataBound 事件中绑定每个内部转发器。

于 2011-04-20T15:28:03.167 回答
0

答案是乍得和克里斯的答案的组合。我最终将转发器全部转储在一起,并在函数中使用了一系列条件和循环来将 html 保存到 aStringBuilder()并输出到Literal.

多谢你们。

于 2011-04-26T15:17:33.687 回答