文档章节

TreeView控件无限级 一次性加载和异步加载剖析

深圳大道
 深圳大道
发布于 2016/12/29 15:31
字数 802
阅读 2
收藏 0
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MSTreeView.aspx.cs" Inherits="MSTreeView" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>TreeView一次性加载和异步加载</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <table>
                    <tr>
                        <td style="width:200px; height:600px; vertical-align:top;">
                            一次性加载<br />
                            <asp:TreeView ID="TreeView2" runat="server" ShowLines="true">
                            </asp:TreeView>
                        </td>
                        <td style="width:200px; height:600px; vertical-align:top;">
                            异步加载<br />
                            <asp:TreeView ID="TreeView1" runat="server"  ShowLines="true"
                                OnTreeNodePopulate="TreeView1_TreeNodePopulate" EnableClientScript="true" ExpandDepth="0">
                            </asp:TreeView>
                        </td>
                    </tr>
                </table>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class MSTreeView : System.Web.UI.Page
{

    protected DataTable dt = createDT();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //一次性加载 适用于小数据量
            TreeView2.Nodes.Clear();
            CreateLevelTreeView(TreeView2, dt, "module_name", "module_id", "module_fatherid");
            TreeView2.ExpandAll();

            //异步加载 适用于大数据量
            TreeView1.Nodes.Clear();
            DataView dv = dt.DefaultView;
            dv.RowFilter = " module_fatherid='0' ";            
            Bind_Root(dv.ToTable(), "module_name", "module_id");
        }

    }

    #region 异步加载TreeView
    /// <summary>
    /// 绑定父节点
    /// </summary>
    /// <param name="dt">数据源</param>
    /// <param name="text">text</param>
    /// <param name="value">value</param>
    private void Bind_Root(DataTable dt,string text,string value)
    {
        TreeNode tn;
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            tn = new TreeNode();
            tn.Value = dt.Rows[i][value].ToString();
            tn.Text = dt.Rows[i][text].ToString();
            //判断是否有子节点
            if (Check_Child(tn.Value))
            {
                tn.PopulateOnDemand = true;
                tn.Expanded = false;
            }
            TreeView1.Nodes.Add(tn);
        }
    }

    /// <summary>
    /// 绑定节点的子节点
    /// </summary>
    /// <param name="treeNode"></param>
    /// <param name="p"></param>
    private void Bind_Child(TreeNode treeNode, string fatherID, string text, string value)
    {
        TreeNode tn;
        DataRow[] drExist = dt.Select(" module_fatherid= '" + fatherID + "'");
        for (int i = 0; i < drExist.Length; i++)
        {
            tn = new TreeNode();
            tn.Value = drExist[i][value].ToString();
            tn.Text = drExist[i][text].ToString();
            //检验是否有子节点
            if (Check_Child(tn.Value))
            {
                tn.PopulateOnDemand = true;
                tn.Expanded = false;
            }
            treeNode.ChildNodes.Add(tn);
        }
    }

    /// <summary>
    /// 判断是否有子节点
    /// </summary>
    /// <param name="pre_Val">父类ID</param>
    /// <returns></returns>
    private bool Check_Child(string pre_Val)
    {
        DataRow[] dr = dt.Select(" module_fatherid= '" + pre_Val + "'");
        bool exist = (dr.Length > 0) ? true : false;
        return exist;
    }


    protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
    {
        Bind_Child(e.Node, e.Node.Value.ToString(), "module_name", "module_id");
    }
    #endregion

    #region 一次性加载TreeView
    /// <summary>   
    /// 创建无限分级目录树TreeView   
    /// </summary>   
    /// <param name="treeview">TreeView空间</param>   
    /// <param name="dt">数据源DataTable</param>   
    /// <param name="text">text字段</param>   
    /// <param name="value">value字段</param>   
    /// <param name="parentid">深度字段 例如parentid</param>   
    public static void CreateLevelTreeView(TreeView treeview, DataTable dt, string text, string value, string parentid)
    {
        DataView dv = dt.DefaultView;
        dv.RowFilter = parentid + " ='0'";
        foreach (DataRowView drv in dv)
        {
            TreeNode node = new TreeNode();
            node.Text = drv[text].ToString();
            node.Value = drv[value].ToString();
            node.Expanded = false;
            treeview.Nodes.Add(node);
            CreatTreeViewChildNode(dv, node, text, value, parentid);
        }
    }

    /// <summary>   
    /// 递归绑定子节点   
    /// </summary>   
    /// <param name="dv">源DataView</param>   
    /// <param name="parentNode">当前节点</param>   
    /// <param name="text">text字段</param>   
    /// <param name="value">value字段</param>   
    /// <param name="parentid">深度字段 例如parentid</param>   
    private static void CreatTreeViewChildNode(DataView dv, TreeNode parentNode, string text, string value, string parentid)
    {
        dv.RowFilter = parentid + " ='" + parentNode.Value + "' ";
        foreach (DataRowView row in dv)
        {
            TreeNode replyNode = new TreeNode();
            replyNode.Text = row[text].ToString();
            replyNode.Value = row[value].ToString();
            replyNode.Expanded = false;
            parentNode.ChildNodes.Add(replyNode);
            CreatTreeViewChildNode(dv, replyNode, text, value, parentid);
        }
    }  
    #endregion

    #region 创建数据
    private static DataTable createDT()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("module_id");
        dt.Columns.Add("module_name");
        dt.Columns.Add("module_fatherid");
        dt.Columns.Add("module_url");
        dt.Columns.Add("module_order");

        dt.Rows.Add("C1", "全国", "0", "", "1");
        dt.Rows.Add("M01", "广东", "C1", "", "1");

        dt.Rows.Add("M0101", "深圳", "M01", "", "100");
        dt.Rows.Add("M010101", "南山区", "M0101", "", "1000");
        dt.Rows.Add("M010102", "罗湖区", "M0101", "", "1001");
        dt.Rows.Add("M010103", "福田区", "M0101", "", "1002");
        dt.Rows.Add("M010104", "宝安区", "M0101", "", "1003");
        dt.Rows.Add("M010105", "龙岗区", "M0101", "", "1004");

        dt.Rows.Add("M01010301", "上梅林", "M010103", "", "1002001");
        dt.Rows.Add("M01010302", "下梅林", "M010103", "", "1002002");
        dt.Rows.Add("M01010303", "车公庙", "M010103", "", "1002003");
        dt.Rows.Add("M01010304", "竹子林", "M010103", "", "1002004");
        dt.Rows.Add("M01010305", "八卦岭", "M010103", "", "1002005");
        dt.Rows.Add("M01010306", "华强北", "M010103", "", "1002006");

        dt.Rows.Add("M0102", "广州", "M01", "", "101");
        dt.Rows.Add("M010201", "越秀区", "M0102", "", "1105");
        dt.Rows.Add("M010202", "海珠区", "M0102", "", "1106");
        dt.Rows.Add("M010203", "天河区", "M0102", "", "1107");
        dt.Rows.Add("M010204", "白云区", "M0102", "", "1108");
        dt.Rows.Add("M010205", "黄埔区", "M0102", "", "1109");
        dt.Rows.Add("M010206", "荔湾区", "M0102", "", "1110");
        dt.Rows.Add("M010207", "罗岗区", "M0102", "", "1111");
        dt.Rows.Add("M010208", "南沙区", "M0102", "", "1112");
        return dt;
    }
    #endregion
}


本文转载自:http://blog.csdn.net/smartsmile2012/article/details/8477146

共有 人打赏支持
深圳大道
粉丝 3
博文 877
码字总数 0
作品 0
深圳
架构师
私信 提问
动态载入数据的无刷新TreeView控件(7)

上一次说了一下要支持无限级的动态加载TreeView控件,服务器端数据的准备情况。不过那只是一个小小的演示实例,在实际的使用中,服务器端的数据可能会完全的不同,不过不管怎么变化,也必须要...

唐玄奘
2017/12/05
0
0
利用内存多叉树实现Ext JS中的无限级树形菜单(一种构建多级有序树形结构JSON的方法)

利用内存多叉树实现Ext JS中的无限级树形菜单(一种构建多级有序树形结构JSON的方法) 一、问题研究的背景和意义 目前在Web应用程序开发领域,Ext JS框架已经逐渐被广泛使用,它是富客户端开...

星星知我心
2012/01/30
3.1K
4
对世界上最强大的一棵 treeview 提出意见

说一下,目前我发现最强大的一棵树形菜单还算 zTee 主页地址为:http://www.baby666.cn/v3/main.php#_zTreeInfo 我研究 treeview(b/s结构) 的时间加起来,应该有一个月以上了。在传统的web...

长平狐
2013/03/28
163
0
MVC3+EF4.1学习系列(十)----MVC+EF处理树形结构

通过前几篇文章 我们处理了 一对一, 一对多,多对多关系 很好的发挥了ORM框架的做用 但是 少说了一种 树形结构的处理, 而这种树形关系 我们也经常遇到,常见的N级类别的处理, 以及经常有数据与...

postdep
2014/02/08
0
0
将Xml文件递归加载到TreeView中

  #region 【通过XDocument的方式将Xml文件递归到TreeView控件中】   //读取Xml文件(XDocument)   //1.加载Xml文件   XDocument document=XDoument.Load("文件名称.xml");   //2...

李洛尘
2018/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

搜索引擎(Elasticsearch搜索详解)

学完本课题,你应达成如下目标: 掌握ES搜索API的规则、用法。 掌握各种查询用法 搜索API 搜索API 端点地址 GET /twitter/_search?q=user:kimchy GET /twitter/tweet,user/_search?q=user:...

这很耳东先生
38分钟前
6
0
浅谈如何减少GC的次数

GC会stop the world。会暂停程序的执行,带来延迟的代价。所以在开发中,我们不希望GC的次数过多。 本文将讨论如何在开发中改善各种细节,从而减少GC的次数。 (1)对象不用时最好显式置为 Nu...

浮躁的码农
39分钟前
1
0
jpa 自定义返回对象

任何ORM框架都少不了开放自定义sql的问题。jpa自然也不例外,很多场景需要写复杂sql的。 首先定义一个方法签名,然后打上@Query注解。像下面这样,需要注意nativeQuery,这个表示query中的字...

朝如青丝暮成雪
今天
3
0
驰骋工作流引擎-批量审批设置

批量审批设置 关键词: 工作流引擎批量审批 Java工作流批量审批设计 应用场景 批量审批最多应用于代办中有很多相同的流程需要审批,若是把一些不是特别重要的审批做批量处理这样就可以提高很...

孟娟
今天
2
0
springmvc源码解析之DispatcherServlet四

说在前面 本次主要介绍DispatcherServlet,关注”天河聊架构“更多精彩。 springmvc配置解析 进入方法org.springframework.web.bind.annotation.support.HandlerMethodInvoker#resolveHttpE...

天河2018
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部