asp.net 数据绑定菜单多级

asp.net databound menu multilevel(asp.net 数据绑定菜单多级)
本文介绍了asp.net 数据绑定菜单多级的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我目前正在使用 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 数据绑定菜单多级的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

ActiveDirectory error 0x8000500c when traversing properties(遍历属性时 ActiveDirectory 错误 0x8000500c)
search by samaccountname with wildcards(使用通配符按 samaccountname 搜索)
Get the list of Groups for the given UserPrincipal(获取给定 UserPrincipal 的组列表)
Can you find an Active Directory User#39;s Primary Group in C#?(你能在 C# 中找到 Active Directory 用户的主要组吗?)
Query From LDAP for User Groups(从 LDAP 查询用户组)
How can I get DOMAINUSER from an AD DirectoryEntry?(如何从 AD DirectoryEntry 获取 DOMAINUSER?)