asp.net(C#)生成无限级别菜单

生成无限级别菜单是一个常见的需求,而使用ASP.NET(C#)实现无限级别菜单可以通过递归来解决。以下是实现过程的详细攻略:

创建数据库表

首先,需要在数据库中保存菜单数据,可以通过如下的SQL语句来创建一个menu数据表:

CREATE TABLE [dbo].[menu](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](50) NOT NULL,
    [url] [varchar](200) NULL,
    [parent_id] [int] NULL,
CONSTRAINT [PK_menu] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

添加数据

然后,向menu表中添加一些示例数据,例如:

insert [dbo].[menu] values('菜单一','/Menu1',0)
insert [dbo].[menu] values('子菜单一','/Menu1/Menu11',1)
insert [dbo].[menu] values('子菜单二','/Menu1/Menu12',1)
insert [dbo].[menu] values('子菜单三','/Menu1/Menu13',1)
insert [dbo].[menu] values('菜单二','/Menu2',0)
insert [dbo].[menu] values('子菜单四','/Menu2/Menu21',5);
insert [dbo].[menu] values('子菜单五','/Menu2/Menu22',5)

数据库连接

在C#中,要使用ADO.NET来连接数据库,使用代码如下:

using System.Data.SqlClient;
using System.Configuration;
string connectionString = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection(connectionString);

创建菜单类

可以通过创建一个Menu类来存储菜单信息,如下所示:

public class Menu {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Url { get; set; }
    public int ParentId { get; set; }
    public List<Menu> Children { get; set; }
}

递归获取数据

使用下面的代码来从数据库中获取菜单数据:

public List<Menu> GetAllMenus() {
    List<Menu> menus = new List<Menu>();
    string query = "SELECT id, name, url, parent_id FROM menu";
    SqlDataReader reader;
    using (SqlCommand cmd = new SqlCommand(query, conn)) {
        conn.Open();
        reader = cmd.ExecuteReader();

        while (reader.Read()) {
            Menu menu = new Menu {
                Id = Convert.ToInt32(reader["id"]),
                Name = reader["name"].ToString(),
                Url = reader["url"].ToString(),
                ParentId = Convert.ToInt32(reader["parent_id"])
            };
            menus.Add(menu);
        }
        reader.Close();
        conn.Close();
    }
    return menus;
}

递归生成菜单

使用如下的代码来递归生成菜单:

public void CreateMenu(List<Menu> menus, int parentId, ref Panel panel) {
    foreach (Menu menu in menus.Where(x => x.ParentId == parentId)) {
        HyperLink link = new HyperLink();
        link.Text = menu.Name;
        link.NavigateUrl = menu.Url;
        panel.Controls.Add(link);
        if (menus.Any(x => x.ParentId == menu.Id)) {
            Panel subMenu = new Panel();
            subMenu.CssClass = "sub-menu";
            panel.Controls.Add(subMenu);
            CreateMenu(menus, menu.Id, ref subMenu);
        }
    }
}

然后在aspx页面中使用以下的代码控件来显示菜单:

<asp:Panel ID="MainMenu" runat="server"></asp:Panel>

在页面加载时,调用以下代码即可生成无限级别菜单:

protected void Page_Load(object sender, EventArgs e) {
    List<Menu> menus = GetAllMenus();
    CreateMenu(menus, 0, ref MainMenu);
}

例如,以上数据添加到数据库后,会生成以下的两个菜单:

菜单一
- 子菜单一
- 子菜单二
- 子菜单三

菜单二
- 子菜单四
- 子菜单五

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp.net(C#)生成无限级别菜单 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C++实践数组类运算的实现参考

    C++实践数组类运算的实现参考 是一篇介绍如何实现C++数组类运算的实用的攻略。下面我将对该攻略进行详细解释。 1. 背景 在C++中,提供了, , 等容器,可以很方便的表示和操作数组。 为了更好的操作这些数组,我们可以自定义一个数组类,并为其实现常见的数学运算,就可以更为方便的使用。 2. 实现思路 本篇攻略引用了底层的数组称之为_base,它是一个一维的…

    C# 2023年6月8日
    00
  • 利用C#守护Python进程的方法

    利用C#守护Python进程的方法 在某些应用场景中,可能需要通过C#程序来启动和守护Python进程,以达到对Python进程的控制和管理。本文将介绍一种利用C#守护Python进程的方法。 原理说明 Python是一门脚本语言,它的运行需要依托于解释器。因此,要启动Python进程,就需要启动对应的Python解释器。在Windows系统中,Python…

    C# 2023年6月6日
    00
  • WinForm实现鼠标拖动控件跟随效果

    为了实现WinForm中的鼠标拖动控件跟随效果,我们需要使用下述步骤: 1. 获取鼠标位置 鼠标在界面上移动时,我们需要获取其当前位置。可以通过下面的代码来获取: private void panel1_MouseMove(object sender, MouseEventArgs e) { Point point = Control.MousePositi…

    C# 2023年6月1日
    00
  • asp.net访问Access数据库溢出错误

    下面是详细的攻略: 概述 在使用ASP.NET访问Access数据库时,可能会遇到数据溢出(Overflow)错误,这是因为Access数据库在处理数据时对于列的大小有限制。本文将介绍如何诊断和解决这种问题。 诊断 出现数据溢出错误时,会抛出System.Data.OleDb.OleDbException: Arithmetic operation resu…

    C# 2023年6月6日
    00
  • C# 小数位数保留的方法集锦

    C# 小数位数保留的方法集锦,这是一个非常实用的技能点,下面我将为大家详细讲解。 1. 保留小数位数的方法 在C# 中,一些数值类型都有自己的 ToString() 方法,这个方法可以用来将值转换为字符串并指定小数位数。在下面的示例中,我们使用 Double 类型,并设置 ToString() 方法来指定小数位数。 double num = 3.141592…

    C# 2023年6月6日
    00
  • c# Task.Wait()与awaiat Task异常处理的区别说明

    c#中有两种等待异步任务完成的函数:Task.Wait()和await Task。这两种方式区别如下: Task.Wait()函数 作用 Task.Wait()函数是用同步等待的方式等待任务完成。它会阻塞当前线程直到任务执行完毕,然后继续执行下一步操作。如果任务执行过程中发生了异常,Wait()函数会将异常抛出给调用方进行处理。 示例 下面是一个使用Task…

    C# 2023年6月6日
    00
  • C#如何利用反射将枚举绑定到下拉框详解

    下面我将详细讲解如何利用反射将C#中的枚举绑定到下拉框中。 什么是反射? C#中的反射是指通过程序运行时访问、检测和修改程序中的成员的一种机制,它能够让我们在运行时获取类的类型信息、访问属性和方法,并动态创建对象等。 怎样利用反射将枚举绑定到下拉框中? 我们可以通过反射获取到枚举类型的所有值,并将它们绑定到下拉框中。 以下是基本的实现代码: // 获取枚举类…

    C# 2023年6月6日
    00
  • C#实现发送邮件的三种方法

    具体的C#实现发送邮件的三种方法攻略如下: 一、使用SMTP客户端库发送邮件 步骤: 引用System.Net.Mail命名空间 csharp using System.Net.Mail; 创建SmtpClient对象,并设置邮件服务器和端口号等相关信息 csharp SmtpClient smtpClient = new SmtpClient(“smtp.…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部