我需要使用asp.net/
C#渲染一个无序列表,其中包含从数据库获得的数据.我的数据看起来像这样.
id Name Depth 1 ELECTRONICS 0 2 TELEVISIONS 1 3 Tube 2 4 LCD 2 5 Plasma 2 6 Portable electronics 1 7 MP3 Player 2 8 Flash 3 9 CD Players 2 10 2 Way Radio 2
使用上面的示例数据,我需要根据深度呈现无序列表,格式如下
<ul> <li>ELECTRONICS <ul> <li>TELEVISIONS <ul> <li>TUBE</li> <li>LCD</li> <li>PLASMA</li> </ul> </li> <li>PORTABLE ELECTRONICS <ul> <li>MP3 PLAYERS <ul> <li>FLASH</li> </ul> </li> <li>CD PLAYERS</li> <li>2 WAY RAdioS</li> </ul> </li> </ul> </li> </ul>
上面的数据只是一个示例,我有一个巨大的记录集,必须转换为无序列表.有人可以给我一个如何实现这一点的想法吗?
int lastDepth = -1; int numUL = 0; StringBuilder output = new StringBuilder(); foreach (DataRow row in ds.Tables[0].Rows) { int currentDepth = Convert.ToInt32(row["Depth"]); if (lastDepth < currentDepth) { if (currentDepth == 0) { output.Append("<ul class=\"simpleTree\">"); output.AppendFormat("<li class=\"root\"><span><a href=\"#\" title=\"root\">root</a></span><ul><li class=\"open\" ><span><a href=\"#\" title={1}>{0}</a></span>",row["name"],row["id"]); } else { output.Append("<ul>"); if(currentDepth==1) output.AppendFormat("<li><span>{0}</span>",row["name"]); else output.AppendFormat("<li><span class=\"text\"><a href=\"#\" title={1}>{0}</a></span>",row["id"]); } numUL++; } else if (lastDepth > currentDepth) { output.Append("</li></ul></li>"); if(currentDepth==1) output.AppendFormat("<li><span>{0}</span>",row["name"]); else output.AppendFormat("<li><span class=\"text\"><a href=\"#\" title={1}>{0}</a></span>",row["id"]); numUL--; } else if (lastDepth > -1) { output.Append("</li>"); output.AppendFormat("<li><span class=\"text\"><a href=\"#\" title={1}>{0}</a></span>",row["id"]); } lastDepth = currentDepth; } for (int i = 1; i <= numUL+1; i++) { output.Append("</li></ul>"); }
使用上面的代码,我的无序列表看起来像这样.
<ul class="simpleTree"> <li class="root"> <span><a href="#" title="root">root</a></span> <ul> <li class="open" > <span><a href="#" title=1>ELECTRONICS</a></span> <ul> <li> <span>TELEVISIONS</span> <ul> <li> <span class="text"><a href="#" title=3>TUBE</a></span> </li> <li> <span class="text"><a href="#" title=4>LCD</a></span> </li> <li><span class="text"><a href="#" title=5>PLASMA</a></span> </li> </ul> </li> <li> <span>PORTABLE ELECTRONICS</span> <ul> <li> <span class="text"><a href="#" title=7>MP3 PLAYERS</a></span> <ul> <li> <span class="text"><a href="#" title=8>FLASH</a></span> </li> </ul> </li> <li> <span class="text"><a href="#" title=9>CD PLAYERS</a></span> </li> <li> <span class="text"><a href="#" title=10>2 WAY RAdioS</a></span> </li> </ul> </li></ul> </li></ul> </li></ul>
谢谢.
解决方法
您可以在代码中执行类似的操作,然后将结果输出到页面上的Literal控件:
int lastDepth = -1; int numUL = 0; StringBuilder output = new StringBuilder(); foreach (DataRow row in yourDataTable.Rows) { int currentDepth = row["Depth"]; if (lastDepth < currentDepth) { output.append("<ul>"); numUL++ } else if (lastDepth > currentDepth) { output.append("</li></ul></li>"); numUL-- } else if (lastDepth > -1) { output.append("</li>"); } output.appendformat("<li class=\"depth-{1}\">{0}",currentDepth); lastDepth = currentDepth; } for (int i = 1;i <= numUL;i++) { output.append("</li></ul>"); } yourLiteralControl.Text = output.toString();
更新:我这样做是为了在注释中请求的深度相关的列表项中放入一个css类.