我有3个表,如下所示引用了ID列:
#Table 1
DepID NAME
1 Dep1
2 Dep2
3 Dep3
#Table 2
RoleID Name DepID
11 A1 1
12 A2 2
13 A3 1
14 A4 3
15 A5 3
#Table 3
ID Name RoleID
21 B1 11
23 B2 14
24 B3 11
输出
我尝试过使用foreach循环,下面是示例:
StringBuilder objstr = new StringBuilder();
List<Parant> objpmenu = new List<Parant>();
List<Child> objcmenu = new List<Child>();
List<NestedChild> objnmenu = new List<NestedChild>();
objpmenu = GetParantMenu();
objcmenu = GetChildMenu();
objnmenu = GetNestedChildMenu();
objstr.Append("<ul id=\"drop-nav\">");
foreach (MenuParant _pitem in objpmenu)
{
objstr.Append("<li ><a href='" + _pitem.Url + "'><span >" +_pitem.MenuName + "</span></a>");
var childitem = objcmenu.Where(m => m.ParentId == _pitem.Id).ToList();
if (childitem.Count > 0)
{
objstr.Append("<ul>");
foreach (var _citem in childitem)
{
objstr.Append("<li ><a id='asubservice" + _citem.ChildId + "' href='" + _citem.ChildUrl + "'><span>" + _citem.ChildName + "</span></a></li>");
var NestedChildItem = objnmenu.Where(s => s.ChildId == _citem.ChildId).ToList();
if (NestedChildItem.Count > 0)
{
objstr.Append("<ul>");
foreach (var _nitem in NestedChildItem)
{
objstr.Append("<li><a href='" + _nitem.NestedChildUrl + "'>" + _nitem.NestedChildName + "</a></li>");
}
objstr.Append("</ul>");
}
}
objstr.Append("</ul>");
}
objstr.Append("</li>");
}
objstr.Append("</ul>");
divmenu.InnerHtml = objstr.ToString();
请帮我使用Linq生成包含HTML内容的菜单。 ThanQ in Advance
答案 0 :(得分:0)
通常,如果你有一个n级层次结构,你将使用递归方法,如下面的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication71
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable("DepID") ;
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("NAME", typeof(string));
dt.Columns.Add("PARENTID", typeof(int));
dt.Rows.Add(new object[] { 1, "Dep1"});
dt.Rows.Add(new object[] { 2, "Dep2"});
dt.Rows.Add(new object[] { 3, "Dep3"});
dt.Rows.Add(new object[] { 11, "A1", 1});
dt.Rows.Add(new object[] { 12, "A2", 2});
dt.Rows.Add(new object[] { 13, "A3", 1});
dt.Rows.Add(new object[] { 14, "A4", 3});
dt.Rows.Add(new object[] { 15, "A5", 3});
dt.Rows.Add(new object[] { 21, "B1", 11});
dt.Rows.Add(new object[] { 23, "B2", 14});
dt.Rows.Add(new object[] { 24, "B3", 11});
Node node = new Node();
node.Load(dt);
}
}
public class Node
{
public static Node root = new Node();
public string name { get; set; }
public int? id { get; set; }
public List<Node> children { get; set; }
public void Load(DataTable dt)
{
LoadRecursive(dt, null, root);
}
public void LoadRecursive(DataTable dt, int? parent, Node node)
{
foreach (DataRow row in dt.AsEnumerable().Where(x => x.Field<int?>("PARENTID") == parent))
{
if (node.children == null) node.children = new List<Node>();
Node newChild = new Node();
node.children.Add(newChild);
newChild.name = row.Field<string>("NAME");
newChild.id = row.Field<int>("ID");
LoadRecursive(dt, newChild.id, newChild);
}
}
}
}
答案 1 :(得分:0)
首先应该摆脱字符串连接。我们有几个框架来处理血腥细节。其中之一就是ASP.Net。
完成后,使用Repeater控件生成标记。了解asp.net中的databinding并使用它来生成菜单,而不是手动循环遍历所有数据。
如果您需要帮助生成我所讨论的Repeater控件,我们非常乐意为您提供更多指导。