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 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>

コード ビハインドのItemTemplateall<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();
    }

子が出力されないすべての通常のノード:<li>name</li> 子が含まれるすべてのノードは、何らかのループですべての子を出力する必要があります。 <li><ul><li></li></ul><li>

私が持っている質問: 1. 適切な出力のためにこのタイプのデータをループする適切な方法は何ですか? 2. リピーターで正常に出力するにはどうすればよいですか? [答え]

私は自分が持っているものがうまくいかないことを知っていますが、私の脳はそれについて考え始めました. どんな助けでも大歓迎です。

他に何か必要な場合はお知らせくださいが、これで十分です。

さあ、私が欲しいものを正しい順序でつかむために、条件文や数学の助けが必要です。

4

3 に答える 3

1

ネストされたリピーターを使用して、すべてのコードを記述して内部の ul を出力することを避けることができます。必要なリストが外側のリピーターのデータ項目オブジェクトのプロパティである限り、リピーターの内部でリピーターのデータソースを宣言的に設定できます。

オブジェクトがこのように構築されていないためにこれが不可能な場合でも、ネストされたリピーター アプローチを使用できますが、ItemDataBound イベントで各内部リピーターをバインドする必要があります。

于 2011-04-20T15:28:03.167 に答える
1

コードをレンダリングするには、OnItemDataBound イベントを使用します。Item テンプレートの内容を次のように置き換えます

<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 に答える
0

答えは、Chad と Chris の答えを組み合わせたものです。最終的にリピーターをまとめてダンプし、関数で一連の条件とループを使用して、html を a に保存しStringBuilder()、出力をLiteral.

みんなありがとう。

于 2011-04-26T15:17:33.687 に答える