zoukankan      html  css  js  c++  java
  • TreeView控件无限级 一次性加载和异步加载剖析

    <%@ 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="200px; height:600px; vertical-align:top;">
                                一次性加载<br />
                                <asp:TreeView ID="TreeView2" runat="server" ShowLines="true">
                                </asp:TreeView>
                            </td>
                            <td style="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
    }


  • 相关阅读:
    基于 HTML5 WebGL 的 3D 仓储管理系统
    基于 HTML5 WebGL 的 3D “弹力”布局
    基于HTML5 Canvas 实现地铁站监控
    基于HTML5的WebGL经典3D虚拟机房漫游动画
    根据矩阵变化实现基于 HTML5 的 WebGL 3D 自动布局
    玩转 HTML5 下 WebGL 的 3D 模型交并补
    基于HTML5 Canvas WebGL制作分离摩托车
    基于HTML5 Canvas的3D动态Chart图表
    基于HTML5 Canvas的工控SCADA模拟飞机飞行
    [iOS]过渡动画之高级模仿 airbnb
  • 原文地址:https://www.cnblogs.com/smartsmile/p/6234334.html
Copyright © 2011-2022 走看看