【问题标题】:ASP.NET Repeater and Outputting Hierarchical DataASP.NET 中继器和输出分层数据
【发布时间】:2011-04-20 14:35:03
【问题描述】:

我目前正在使用这种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 中的内容替换为后面代码中的所有 &lt;li&gt; 和嵌套的 &lt;ul&gt;

这是我当前的代码:

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();
    }

所有没有子节点的常规节点输出:&lt;li&gt;name&lt;/li&gt; 所有带子节点的节点都需要在某种循环中输出它的所有子节点: &lt;li&gt;&lt;ul&gt;&lt;li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这回答了我的两个问题之一。
    • 另一个问题是什么?如果您想知道如何获取数据,我会使用递归函数。
    【解决方案2】:

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

    如果由于对象不是以这种方式构造而无法做到这一点,您仍然可以使用嵌套转发器方法,只需在 ItemDataBound 事件中绑定每个内部转发器。

    【讨论】:

    • 如果我可以生成无限数量的关卡,它会起作用吗?
    • 我认为它不会很好用。也许你最好创建某种递归函数来生成列表并将它们转储到文字控件中,然后一起跳过中继器。
    • 一起跳过中继器...不错的主意。我会看看我能用什么。谢谢你的建议。我无法将其标记为正确,因为它仅适用于两个节点级别。
    • 它不适用于仅两个级别的节点...您可以根据需要在彼此内嵌套任意数量的中继器,每个子中继器将引用父数据项以获取子数据源参数的属性。只会很慢。
    • 是的,但我认为除非您以编程方式添加它们,否则您必须知道手头有多少级别。
    【解决方案3】:

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

    谢谢大家。

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 2013-11-13
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多