常用的在数据库中建立无限级树形菜单的asp.net代码

建立无限级树形菜单是Web开发的常见需求之一。在ASP.NET框架下,我们可以使用数据库的递归查询,加上C#语言的代码逻辑来实现这个功能。下面是需要遵循的步骤和示例说明:

第一步:建立数据库表

应该建立一个名为Menus的表,包含以下字段:

  • Id(菜单ID,主键,自增)
  • Name(菜单名,varchar类型)
  • ParentId(父菜单ID,int类型)

字段内容示例如下:

CREATE TABLE Menus
(
Id int PRIMARY KEY IDENTITY(1,1),
Name varchar(50) NOT NULL,
ParentId int NOT NULL
)

第二步:插入数据

插入几条数据作为示例,在本例中使用如下数据:

INSERT INTO Menus (Name, ParentId) VALUES ('Menu 1', 0)
INSERT INTO Menus (Name, ParentId) VALUES ('Menu 1-1', 1)
INSERT INTO Menus (Name, ParentId) VALUES ('Menu 1-2', 1)
INSERT INTO Menus (Name, ParentId) VALUES ('Menu 2', 0)
INSERT INTO Menus (Name, ParentId) VALUES ('Menu 2-1', 4)
INSERT INTO Menus (Name, ParentId) VALUES ('Menu 2-1-1', 5)
INSERT INTO Menus (Name, ParentId) VALUES ('Menu 2-1-2', 5)

第三步:添加引用

在项目中添加以下引用:

using System.Data.SqlClient;
using System.Data;

第四步:写逻辑代码

使用递归查询来检索整个菜单树:

private void BindTreeView(TreeNode treeNode, int parentId)
{
    DataTable dt = GetDataTable(parentId);
    foreach (DataRow dr in dt.Rows)
    {
        TreeNode subTreeNode = new TreeNode(dr["Name"].ToString(), dr["Id"].ToString());
        treeNode.ChildNodes.Add(subTreeNode);
        BindTreeView(subTreeNode, Convert.ToInt32(dr["Id"]));
    }
}

private DataTable GetDataTable(int parentId)
{
    using (SqlConnection con = new SqlConnection("ConnectionString"))
    {
        using (SqlCommand cmd = new SqlCommand("SELECT * FROM Menus WHERE ParentId = @ParentId", con))
        {
            cmd.Parameters.AddWithValue("@ParentId", parentId);
            using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
            {
                DataTable dt = new DataTable();
                sda.Fill(dt);
                return dt;
            }
        }
    }
}

第五步:执行代码

将以下代码添加到aspx文件中的Page_Load事件中:

if (!Page.IsPostBack)
{
    DataTable dt = GetDataTable(0);
    foreach (DataRow dr in dt.Rows)
    {
        TreeNode treeNode = new TreeNode(dr["Name"].ToString(), dr["Id"].ToString());
        BindTreeView(treeNode, Convert.ToInt32(dr["Id"]));
        TreeView1.Nodes.Add(treeNode);
    }
}

示例说明

以下是根据示例数据生成的菜单:

- Menu 1
  |- Menu 1-1
  |- Menu 1-2
- Menu 2
  |- Menu 2-1
    |- Menu 2-1-1
    |- Menu 2-1-2

另一个示例

如果您需要一个具有“下级数量标记”的树形菜单,您可以将以下代码添加到.BindTreeView方法的foreach循环中:

int childCount = GetChildCount(Convert.ToInt32(dr["Id"]));
if (childCount > 0)
{
    bool expanded = true;
    if (treeNode.Expanded.HasValue)
    {
        expanded = treeNode.Expanded.Value;
    }
    treeNode.Text += $" ({childCount})";
    treeNode.Expand(expanded);
}

此处使用了以下方法来获取子级的数量:

private int GetChildCount(int id)
{
    using (SqlConnection con = new SqlConnection("ConnectionString"))
    {
        using (SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM Menus WHERE ParentId = @Id", con))
        {
            cmd.Parameters.AddWithValue("@Id", id);
            con.Open();
            return Convert.ToInt32(cmd.ExecuteScalar());
        }
    }
}

示例说明:

- Menu 1 (2)
  |- Menu 1-1 (0)
  |- Menu 1-2 (0)
- Menu 2 (1)
  |- Menu 2-1 (2)
    |- Menu 2-1-1 (0)
    |- Menu 2-1-2 (0)

以上就是建立无限级树形菜单的asp.net代码攻略,希望对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:常用的在数据库中建立无限级树形菜单的asp.net代码 - Python技术站

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

相关文章

  • c#读写App.config,ConfigurationManager.AppSettings 不生效的解决方法

    针对 “c#读写App.config,ConfigurationManager.AppSettings不生效的解决方法” 这个问题,我们可以从以下几个方面入手: 1. 确认App.config格式是否正确 在使用App.config的时候,我们需要确保这个文件名及格式都是正确的,这是一个很容易被忽略的问题。首先,确认你的App.config文件是放在程序的根…

    C# 2023年5月15日
    00
  • C# .NET创建虚拟目录的方法详解

    C# .NET创建虚拟目录的方法详解 当我们需要在 IIS 中创建虚拟目录时,可以利用 C# .NET 中的 Microsoft.Web.Administration 命名空间来实现。该命名空间提供了访问 IIS 的 API,可以通过代码创建、删除和修改虚拟目录等功能。 步骤一:添加引用 在开始之前,需要添加 Microsoft.Web.Administra…

    C# 2023年6月3日
    00
  • C#使用Newtonsoft.Json中的JObject对象

    当我们需要在C#应用程序中处理JSON数据时,可以使用Newtonsoft.Json库。该库提供了许多用于处理JSON数据的类和方法,其中一个非常有用的类是JObject。 JObject类表示一个JSON对象,它的属性通常是一个或多个JToken对象。以下是使用JObject操作JSON数据的完整攻略。 步骤1:导入Newtonsoft.Json库 首先,…

    C# 2023年5月31日
    00
  • C#实现Windows Form调用R进行绘图与显示的方法

    下面我将为您详细讲解“C#实现WindowsForm调用R进行绘图与显示的方法”的完整攻略。本攻略将分为以下几个步骤: 安装R语言环境和R.Net库 在使用C#调用R前,需要先安装R语言环境和R.Net库。可以在R官网(https://www.r-project.org/)下载最新版本的R语言环境,并在控制台中安装R.Net库。R.Net库可以通过NuGet…

    C# 2023年5月15日
    00
  • .NET Core、Xamarin、.NET Standard和.NET Framework四者之间的区别介绍

    .NET Core、Xamarin、.NET Standard和.NET Framework四者之间的区别介绍 在 .NET 生态系统中,有多个不同的平台和框架,包括 .NET Core、Xamarin、.NET Standard和.NET Framework。这些平台和框架之间有很多区别,本攻略将详细介绍它们之间的区别。 .NET Core .NET Co…

    C# 2023年5月17日
    00
  • 理解C#中的枚举(简明易懂)

    理解C#中的枚举(简明易懂) 在C#中,枚举是一种非常有效的机制来表示一组具有固定数量的离散值。本文将介绍在C#中使用枚举的概念、语法和示例。 概念 枚举是一个具有几个命名常量的数据类型。它是由相同类型的常量值组成的自定义数据类型。使用枚举可以增加代码的可读性,使代码更加容易维护和理解。 枚举的优点 使用枚举可以使代码更加自然。比如在我们日常生活中,一个星期…

    C# 2023年5月31日
    00
  • C#数据绑定(DataBinding)简单实现方法

    C#数据绑定是现代软件开发中的一个非常重要的技术,它可以将各种数据源(例如:数据库、XML文档、Web服务、对象集合等)绑定到用户界面上的不同控件(例如:文本框、标签、列表框、表格等),并且随着数据的更改,控件中的内容也会自动更新。下面介绍C#数据绑定的简单实现方法。 准备工作 在进行数据绑定之前,我们需要创建一个Windows Form应用程序或ASP.N…

    C# 2023年6月1日
    00
  • C# 线程同步的方法

    C# 线程同步是确保多个线程正确协作的重要技术之一。本文将介绍C# 线程同步的几种常见方法。 线程同步的概念 当多个线程访问同一个共享资源时,就需要保证每个线程访问资源的操作是有序的、正确的。否则,就会出现数据竞争、不可预测的结果和崩溃等问题。线程同步的目的就是保证这些操作的有序性和正确性。 常用的线程同步方法有: 1. 互斥锁 互斥锁(Mutex)是一种系…

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