建立无限级树形菜单是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技术站