Ретранслятор ASP.NET и вывод иерархических данных - PullRequest
1 голос
/ 20 апреля 2011

Я сейчас использую 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 для вывода данных с использованием списков и 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();
    }

Все обычные узлы без дочерних выходов: <li>name</li> Все узлы WITH children должны выводить все свои дочерние элементы в какой-то цикл: <li><ul><li></li></ul><li>

У меня есть вопросы: 1. Как правильно перебрать данные этого типа для правильного вывода? 2. Как мне успешно вывести его в ретранслятор? [ОТВЕТ]

Я знаю, что у меня не получится, но мой мозг начал думать об этом. Любая помощь будет принята с благодарностью.

Если вам требуется что-то еще, дайте мне знать, но это должно быть так.

Давай, ребята, мне нужна помощь с условными или математическими данными, чтобы получить то, что я хочу, в правильном порядке.

Ответы [ 3 ]

1 голос
/ 20 апреля 2011

Вы можете использовать вложенный повторитель и избежать написания всего кода для вывода внутреннего ul. Вы можете декларативно установить источник данных повторителя внутри повторителя, если необходимый вам список является свойством объекта элемента данных внешнего повторителя.

Если это невозможно, поскольку объекты не сконструированы таким образом, вы все равно можете использовать подход с вложенными повторителями, просто вам нужно будет связать каждый внутренний повторитель в событии ItemDataBound.

1 голос
/ 20 апреля 2011

Используйте событие OnItemDataBound для визуализации вашего кода.Замените содержимое шаблона элемента на

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

Затем в обработчике события ItemDataBound создайте необходимую структуру в виде строки и присвойте ее литеральному свойству Text.

((Literal)e.Item.FindControl("Literal1")).Text = MyNewStructureString;
0 голосов
/ 26 апреля 2011

Ответ - это комбинация ответов Чада и Криса.Я закончил тем, что сбросил репитер все вместе и использовал ряд условных выражений и циклов в функции для сохранения html в StringBuilder() и вывода в Literal.

Спасибо, ребята.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...