我目前正在使用这种存储数据的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]
我知道我所拥有的东西是行不通的,但是我的脑子开始在煎熬这一切。任何帮助将不胜感激。
如果您需要其他任何内容,请告诉我,但这应该是它。
来吧,我需要条件或数学方面的帮助才能以正确的顺序抓住我想要的东西。
答案 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
。
谢谢你们。