动态生成TreeView方法(一)
时间:2022-04-25
本文章向大家介绍动态生成TreeView方法(一),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一般情况下生成TreeView我们用的是用递归不建议用递归数据量大了会慢,
小弟今天用SortedList集合实现一下没有技术含量,一看代码大家就会明白。个人也比较喜欢这种方法,数据量大了执行速度也可以。
下一篇方法动态生成TreeView(二)是用递归实现的,有时间可以看一下。
思路:
把节点放到SortedList,里再根据标识找到父节点,加上相应的子节点。
只是一个小例子,有很多方面不足,可以在这个例子上扩展,传参什么的可以自己在数据库里建,等等,让这个例子变成你自己的东西。
效果图:
前台页面:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TreeViewPage.aspx.cs" Inherits="WebApplication3.TreeViewPage" %>
<!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="tv_Method" runat="server" Width="200px" >
</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.Data;
using System.Collections;
namespace WebApplication3
{
public partial class TreeViewPage : System.Web.UI.Page
{
private DataTable dt;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
dt = CreateTable();
CreateTree();
}
}
#region 生成树
public void CreateTree()
{
try
{
//SortedList集合表示键/值对的集合,
//这些键值对按键排序并可按照键和索引访问.如果不懂自己去查msdn
SortedList m_SortedList = new SortedList();
TreeNode treeNode = new TreeNode();
if (dt.Rows.Count <= 0)
{
treeNode.Text = "为空";
treeNode.Value = "";
treeNode.NavigateUrl = "";
treeNode.Target = "";
treeNode.Expanded = false;
treeNode.SelectAction = TreeNodeSelectAction.SelectExpand;
}
else
{
for (int i = 0; i < dt.Rows.Count; i++)
{
//创建父节点
if (dt.Rows[i]["Grade"].ToString() == "1")
{
TreeNode node = new TreeNode();
node.Text = dt.Rows[i]["MenuName"].ToString();
node.Value = dt.Rows[i]["MenuID"].ToString();
if (dt.Rows[i]["Flag"].ToString() == "1")
{
node.NavigateUrl = dt.Rows[i]["href"].ToString();
treeNode.Target = "_blank";
}
node.Expanded = false;
node.SelectAction = TreeNodeSelectAction.Expand;
m_SortedList.Add(node.Value, node);
tv_Method.Nodes.Add(node);
}
else
{
//找到父节点
TreeNode parentNode = (TreeNode)m_SortedList.GetByIndex(m_SortedList.IndexOfKey(dt.Rows[i]["ParentMenu"].ToString()));
//创建子节点
TreeNode childNode = new TreeNode();
childNode.Text = dt.Rows[i]["MenuName"].ToString();
childNode.Value = dt.Rows[i]["MenuID"].ToString();
if (dt.Rows[i]["Flag"].ToString() == "1")
{
childNode.NavigateUrl = dt.Rows[i]["href"].ToString();
treeNode.Target = "_blank";
}
childNode.Expanded = false;
childNode.SelectAction = TreeNodeSelectAction.Expand;
m_SortedList.Add(childNode.Value, childNode);
parentNode.ChildNodes.Add(childNode);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
#region 创建Menu表
public DataTable CreateTable()
{
try
{
DataTable dt = new DataTable();
dt.Columns.Add("MenuID", typeof(string));
dt.Columns.Add("MenuName", typeof(string));
dt.Columns.Add("ParentMenu", typeof(string));//父节点
dt.Columns.Add("Grade", typeof(int));//标识这是第几级节点
dt.Columns.Add("Flag", typeof(int));//标识,是不是尾结点,1是 0 不是
dt.Columns.Add("href", typeof(string));//指向的链接
DataRow dr = dt.NewRow();
dr["MenuID"] = "Menu01";
dr["MenuName"] = "第一级";
dr["ParentMenu"] = "";
dr["Grade"] = 1;
dr["Flag"] = 1;
dr["href"] = "one.aspx";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["MenuID"] = "Menu02";
dr["MenuName"] = "第一级";
dr["ParentMenu"] = "";
dr["Grade"] = 1;
dr["Flag"] = 0;
dr["href"] = "";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["MenuID"] = "Menu0201";
dr["MenuName"] = "第一下一级";
dr["ParentMenu"] = "Menu02";
dr["Grade"] = 2;
dr["Flag"] = 1;
dr["href"] = "one.aspx";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["MenuID"] = "Menu0202";
dr["MenuName"] = "第一下一级";
dr["ParentMenu"] = "Menu02";
dr["Grade"] = 2;
dr["Flag"] = 1;
dr["href"] = "";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["MenuID"] = "Menu020201";
dr["MenuName"] = "第一下一下一级";
dr["ParentMenu"] = "Menu0202";
dr["Grade"] = 2;
dr["Flag"] = 1;
dr["href"] = "one.aspx";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["MenuID"] = "Menu03";
dr["MenuName"] = "第一级";
dr["ParentMenu"] = "";
dr["Grade"] = 1;
dr["Flag"] = 1;
dr["href"] = "one.aspx";
dt.Rows.Add(dr);
return dt;
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
}
}
- 一则数据库无法重启的案例分析(r8笔记第96天)
- 最大公约数和最小公倍数及其应用(Go语言解法)
- JAVA private私有类的 默认构造函数 的生成过程
- 一次数据变更的审核过程(r8笔记第95天)
- JavaScript 学习一
- 与Ajax同样重要的jQuery(2)
- 寻找第K元素的八大算法、源码及拓展
- 索引优先队列-IndexedPrirotyQueue的原理及实现(源码)
- Java 集合系列02之 Collection架构
- 开发者需要掌握的JS事件
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- Kosaraju算法、Tarjan算法分析及证明--强连通分量的线性算法
- 关于curl网站运维与开发的那些事
- 并查集Union-find及其在最小生成树中的应用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Kettle构建Hadoop ETL实践(三):Kettle对Hadoop的支持
- 3种 Springboot 全局时间格式化方式,别再写重复代码了
- 一文搞懂CDN加速原理
- 3分钟短文:Laravel Carbon自定义日期时间格式
- (30)字符截取命令sed
- 2. Bean Validation声明式校验方法的参数、返回值
- 如何识别和阻止基于电报的僵尸网络
- 由String,String Builder,String Buffer 引起的面试惨案
- MySQL案例:各类临时文件的存放位置
- 关于加@Transactional注解的方法之间调用,事务是否生效的问题
- 基于Vue实现一个有点意思的拼拼乐小游戏
- 硬核手写字节码实现HelloWorld
- 由 go orm 引发的探索
- 为什么不建议在 for 循环里捕捉异常?
- 我就是想找个下标,怎么用到二分查找了?