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

来源:互联网 发布:台湾 公娼 知乎 编辑:程序博客网 时间:2024/05/17 06:18
<%@ 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}