ASP.NET转发器和输出分层数据

时间:2011-04-20 14:35:04

标签: c# asp.net for-loop jstree datarepeater

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

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

姓名| nodeLeft | nodeRight | nodeLevel

主页| 1 | 6 | 1

ContentA | 2 | 5 | 2

ContentB | 3 | 4 | 2

关于| 7 | 8 | 1

现在我使用ASP.NET Repeater使用列表和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中所有<li>和嵌套<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();
    }

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

我的问题: 1.为了正确输出,循环使用此类数据的正确方法是什么? 2.如何在转发器中成功输出? [ANSWER]

我知道我所拥有的东西是行不通的,但是我的脑子开始在煎熬这一切。任何帮助将不胜感激。

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

来吧,我需要条件或数学方面的帮助才能以正确的顺序抓住我想要的东西。

3 个答案:

答案 0 :(得分:1)

使用OnItemDataBound事件来呈现您的代码。用

替换项目模板的内容
<ItemTemplate>       
    <asp:Literal ID="Literal1" runat="server"></asp:Literal>
</ItemTemplate> 

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

((Literal)e.Item.FindControl("Literal1")).Text = MyNewStructureString;

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

答案是Chad和Chris的答案的结合。我最终将转发器一起转储并在函数中使用了一系列条件和循环来将html保存在StringBuilder()中并输出到Literal

谢谢你们。