
<%@ 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个比较常用的方法。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)