我目前正在使用 asp.net 菜单控件从表父/子项加载.我遇到的问题是,如果孩子有另一个孩子.从这个意义上说,我的代码有点静态,我似乎找不到更好的或该"的方法来做到这一点.我已经将站点地图视为数据源,但我不需要站点地图,并且觉得这对于我需要实现的目标来说太过分了.
I am currently using an asp.net menu control to load from a table parent/child items. The problem I am having is that if the child has another child. My code is kindof static in that sense and I can't seem to find a better or "the" way to do it. I have seen sitemap as datasources but i don't need a sitemap and feel that would just be overkill for what I need to achieve.
foreach (ClassName option in list)
{
MenuItem module = new MenuItem(option.Description.ToLower(), "", "", option.Url + "?option=" + option.Optionid);
module.Selectable = true;
navigation.Items.Add(module);
//this is my second level
foreach (ClassName child in listfromparent(option.Optionid))
{
MenuItem childmenu = new MenuItem(child.Description.ToLower(), "", "", child.Url + "?option=" + child.Optionid);
module.ChildItems.Add(childmenu);
}
}
如您所见,这适用于 2 个级别:(当然,我可以在 child 中放置另一个 childlevel 来创建第 3 个级别,但是如果有第 4 个、第 5 个呢?所以这就是为什么我需要它自己做.我注意到 treeview 有 onpopulate 但显然 Menu 没有.提前致谢.
as you can see this works but for 2 levels :( and of course i could put another childlevel inside child to create the 3rd level but what if there is a 4th, 5th? So that's why I need it to do it itself. I noticed treeview has onpopulate but apparently Menu doesn't. Thanks in advance.
这是您可以做到的一种方法.
Here's one way you could do it.
也许您可以跳过中间步骤,将邻接列表直接映射到 MenuItems 树,也许可以在 MenuItem 上使用一些扩展方法.
Maybe you could skip that middle step and map the adjacency list straight to a tree of MenuItems, maybe with some extension methods on MenuItem.
但无论如何...
Default.aspx
<%@ Page Language="C#" Inherits="MenuTreeDemo.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head runat="server">
<title>Default</title>
</head>
<body>
<form id="form1" runat="server">
<asp:Menu ID="MyMenu" runat="server" StaticDisplayLevels="3" />
</form>
</body>
</html>
Default.aspx.cs
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Collections.Generic;
namespace MenuTreeDemo
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
MenuNode root = ConvertTableToTree(GetTreeTable());
foreach (MenuNode topLevelNode in root.Children)
{
MyMenu.Items.Add(topLevelNode.ToMenuItem()); // Visits all nodes in the tree.
}
}
}
// The menu tree as an adjacency list in a table.
static DataTable GetTreeTable()
{
DataTable table = new DataTable();
table.Columns.Add("Id", typeof(int));
table.Columns.Add("Description", typeof(string));
table.Columns.Add("Url", typeof(string));
table.Columns.Add("ParentId", typeof(int));
table.Rows.Add(1, "TopMenu1", "/foo.html", 0);
table.Rows.Add(2, "SubMenu1.1", "/baz.html", 1);
table.Rows.Add(3, "SubMenu1.2", "/barry.html", 1);
table.Rows.Add(4, "SubMenu1.2.1", "/skeet.html", 3);
table.Rows.Add(5, "TopMenu2", "/bar.html", 0);
table.Rows.Add(6, "TopMenu3", "/bar.html", 0);
table.Rows.Add(7, "SubMenu3.1", "/ack.html", 6);
return table;
}
// See e.g. http://stackoverflow.com/questions/2654627/most-efficient-way-of-creating-tree-from-adjacency-list
// Assuming table is ordered.
static MenuNode ConvertTableToTree(DataTable table)
{
var map = new Dictionary<int, MenuNode>();
map[0] = new MenuNode() { Id = 0 }; // root node
foreach (DataRow row in table.Rows)
{
int nodeId = int.Parse(row["Id"].ToString());
int parentId = int.Parse(row["ParentId"].ToString());
MenuNode newNode = MenuNodeFromDataRow(row);
map[parentId].Children.Add(newNode);
map[nodeId] = newNode;
}
return map[0]; // root node
}
static MenuNode MenuNodeFromDataRow(DataRow row)
{
int nodeId = int.Parse(row["Id"].ToString());
int parentId = int.Parse(row["ParentId"].ToString());
string description = row["Description"].ToString();
string url = row["Url"].ToString();
return new MenuNode() { Id=nodeId, ParentId=parentId, Description=description, Url=url };
}
}
}
MenuNode.cs
using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;
namespace MenuTreeDemo
{
public class MenuNode
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Description { get; set; }
public string Url { get; set; }
public List<MenuNode> Children { get; set; }
public MenuNode ()
{
Children = new List<MenuNode>();
}
// Will visit all descendants and turn them into menu items.
public MenuItem ToMenuItem()
{
MenuItem item = new MenuItem(Description) { NavigateUrl=Url };
foreach (MenuNode child in Children)
{
item.ChildItems.Add(child.ToMenuItem());
}
return item;
}
}
}
这篇关于asp.net 数据绑定菜单多级的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!