动态生成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
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏c#开发者

lightswitch 添加 TreeView 控件

代码片段 <UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presen...

3227
来自专栏菩提树下的杨过

(Head First 设计模式)学习笔记(1)

把书中开篇duck问题的代码翻译成了c#版: 概述: 某游戏公司要设计一款鸭子的游戏,里面有各种各样的鸭子,有些会飞,有些会叫,但都会游泳。而且不同种类的鸭子...

2049
来自专栏AhDung

【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法

比如Json.NET的JObject明明实现了IEnumerable<T>,具体来说是IEnumerable<KeyValuePair<string, JTok...

1061
来自专栏c#开发者

asp.net回调javascript

using System; using System.Collections; using System.IO; using System.Text; ...

3215
来自专栏大内老A

难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?

开门见山,下面的例子中通过调用ThreadPool.QueueUserWorkItem(WaitCallback callBack, object state)...

2977
来自专栏别先生

fastjson如何判断JSONObject和JSONArray

1、fastjson如何判断JSONObject和JSONArray,百度一下,教程还真不少,但是是阿里的fastjson的我是没有找到合适的方法。这里用一个还...

8662
来自专栏hbbliyong

Start transaction not working with Revit 2014

You're right, it's not being used correctly. The Transaction needs to take plac...

3409
来自专栏hbbliyong

LINQ分页和排序,skip和Take 用法

LINQ分页和排序,skip和Take 用法 dbconn.BidRecord.OrderBy(p=>p.bid_id).ToList<BidRecord>()...

3769
来自专栏lgp20151222

JSONObject和JSONArray区别及基本用法

        例如:   { "id" : "123", "courseID" : "huangt-test", "title" : "提交作业", "con...

741
来自专栏木宛城主

曾经的代码系列——AJAX和JSON生成下拉列表框

代码测试使用 前台页面 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GetGradeC...

1877

扫码关注云+社区