Ретранслятор ASP.NET и вывод иерархических данных
В настоящее время я использую этот 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 ответа
Ответ представляет собой сочетание ответов Чада и Криса. В итоге я сбросил репитер все вместе и использовал ряд условных выражений и циклов в функции, чтобы сохранить HTML в StringBuilder()
и вывод в Literal
,
Спасибо, парни.
Используйте событие OnItemDataBound для визуализации вашего кода. Замените содержимое шаблона элемента на
<ItemTemplate>
<asp:Literal ID="Literal1" runat="server"></asp:Literal>
</ItemTemplate>
Затем в обработчике события ItemDataBound создайте желаемую структуру в виде строки и присвойте ее литеральному свойству Text.
((Literal)e.Item.FindControl("Literal1")).Text = MyNewStructureString;
Вы можете использовать вложенный повторитель и избежать написания всего кода для вывода внутреннего ul. Вы можете декларативно установить источник данных повторителя внутри повторителя, если необходимый вам список является свойством объекта элемента данных внешнего повторителя.
Если это невозможно из-за того, что объекты не сконструированы таким образом, вы все равно можете использовать подход с вложенными повторителями, просто вам нужно будет связать каждый внутренний повторитель в событии ItemDataBound.