我得到了 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
输出
- 菜单
- 出发1
- A1
- B1
- B3
- 答3
- A1
- 出发2
- A2
- Dep3
- A4
- B2
- 答5
- A4
我尝试使用 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 内容的菜单。 提前感谢Q
通常,在具有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);
}
}
}
}
你应该首先摆脱字符串连接。我们有几个框架来处理血腥的细节。其中一种称为 ASP.Net。
完成此操作后,使用中继器控件生成标记。了解 asp.net 中的数据绑定,并使用它来生成菜单,而不是手动循环遍历所有数据。
如果您需要帮助生成我所说的那些中继器控件,我将非常乐意为您提供进一步的指导。