使用treeview控件读数据库动态生成带checkbox复选框的树形导航菜单asp.net(C#),急求帮助还可加分

使用treeview控件读数据库动态生成带checkbox复选框的树形导航菜单asp.net(C#),急求帮助还可加分,第1张

页面

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Tree.aspx.cs" Inherits="MyTeachers.web.Tree" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title></title>

</head>

<body>

<form id="form1" runat="server">

<div>

<asp:TreeView ID="TreeView1" runat="server" Height="257px" ImageSet="WindowsHelp"

Width="142px" Target="rightFrame">

</asp:TreeView>

</div>

</form>

</body>

</html>

后台

using System

using System.Collections.Generic

using System.Linq

using System.Web

using System.Web.UI

using System.Web.UI.WebControls

using System.Web.Security

using System.Web.UI.WebControls.WebParts

using System.Web.UI.HtmlControls

using System.Data

namespace MyTeachers.web

{

public partial class Tree : System.Web.UI.Page

{

DataView dv

DataTable dt

protected void Page_Load(object sender, EventArgs e)

{

if (!Page.IsPostBack)

{

int id =Convert.ToInt32(Session["userID"])

//数据库执行查询的方法就不写了。

//Operator op = new Operator()

//这里执行的是:select * from tabmenu

dt = BLL.tabMenuBLL.GetAlltabMenut(id)

//第一次加载时调用方法传参

CreateTree(0, null, dt, this.TreeView1)

}

}

/// <summary>

/// 创建一个树

/// </summary>

/// <param name="parentID">父ID</param>

/// <param name="node">节点</param>

/// <param name="dt">DataTable</param>

/// <param name="treeView">TreeView的名称</param>

public void CreateTree(int parentID, TreeNode node, DataTable dt, TreeView treeView)

{

//实例化一个DataView dt = 传入的DataTable

dv = new DataView(dt)

//筛选(相当于select * from tabMenu where menuParentID = 传入的 parentID)

dv.RowFilter = "[pid]=" + parentID

//用foreach遍历dv

foreach (DataRowView row in dv)

{

//第一次加载时为空

if (node == null)

{

//创建根节点

TreeNode root = new TreeNode()

//root.Target = "rightFrame"

//必须与数据库的对应

root.Text = row["menuName"].ToString()

root.Value = row["menuID"].ToString()

//添加根节点

this.TreeView1.Nodes.Add(root)

//递归调用方法本身

CreateTree(int.Parse(row["menuID"].ToString()), root, dt, treeView)

}

else

{

//添加子节点

TreeNode childNode = new TreeNode()

childNode.Text = row["menuName"].ToString()

childNode.Value = row["menuID"].ToString()

childNode.NavigateUrl = row["menuUrl"].ToString()

node.ChildNodes.Add(childNode)

CreateTree(int.Parse(row["menuID"].ToString()), childNode, dt, treeView)

}

}

}

}

}

第一种:单表。

列分别为 id、菜单名称、子菜单id列表

id:菜单的唯一编号

子菜单id列表:用逗号(或其他分隔符)分割的多个id的字符串,再由程序中进行处理,分割出多个id;

优点:查询速度非常快。

缺点:不利于维护和拓展,在进行菜单项排序时需要再多写代码进行处理。

第二种:单表内连接。

列分别为 id、菜单名称、父菜单id

根节点的父菜单id为null或者0等一个可以唯一标志的。在查询时进行表内连接查询;

优点:利于表结构的维护和拓展,并且符合设计范式;

缺点:在查询时会造成一些麻烦,并且性能上会受到影响。

当然还有很多其他的方法,这里只例举2个比较常用的方法。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10035405.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存