TreeView的异步延时加载

TreeView的延时加载

在使用TreeView控件的时候,如果数据量太大,这个TreeView控件加载会很慢,有时甚至加载失败,

为了更好的使用TreeView控件加载大量的数据,采用异步延迟加载TreeView。

在TreeView每个结点的前面都有个"+"号,点击这个”+“号触发的事件是OnTreeNodeExpanded="TreeView1_TreeNodeExpanded" ,在刚开始加载TreeView的时候,如果结点下面

还有子节点的话,只加载一个子节点;在点击”+“号,触发OnTreeNodeExpanded事件的时候,再加载该结点下的

所有子节点,这样速度就很快了。参考了“假面Wilson” 博文,并进行了功能增加。

aspx代码

<asp:TreeView ID="TreeView1" runat="server" Font-Size="Medium" OnTreeNodeExpanded="TreeView1_TreeNodeExpanded" 
ForeColor="LightSlateGray" LeafNodeStyle-ForeColor="#3333ff" ShowLines="true" ExpandDepth="1"> <SelectedNodeStyle CssClass="selectNode" /> </asp:TreeView>

aspx.cs代码

 1     private void LoadNewTree()
 2     {
 3         DataTable dtp = pagBLL.GetList(" superfuncid=0  order by sort asc").Tables[0];
 4         if (dtp.Rows.Count > 0)
 5         {
 6             //首先清除树型控件内的结点
 7             this.TreeView1.Nodes.Clear();
 8             for (int i = 0; i < dtp.Rows.Count; i++)
 9             {
10 
11                 //实例出一个结点
12                 TreeNode Node = new TreeNode();
13                 Node.Text = dtp.Rows[i]["funcname"].ToString();
14                 Node.Value = dtp.Rows[i]["pagefuncid"].ToString();
15                 Node.ToolTip = dtp.Rows[i]["funcurl"].ToString();
16                 Node.ImageUrl = "../../" + dtp.Rows[i]["imageurl"].ToString(); 
17                 this.TreeView1.Nodes.Add(Node);//增加父节点,这时直接往树TreeView1上加
18                 this.LoadAddSign(Node.ChildNodes,Convert.ToInt32(dtp.Rows[i]["pagefuncid"].ToString()));
19                 TreeView1.CollapseAll();
20 
21             }
22         }
23     }
 1     /// <summary>
 2     /// 用于加载显示 树形控件 +号的,加载下面的一个节点。
 3     /// </summary>
 4     /// <param name="Conn"></param>
 5     /// <param name="tn"></param>
 6     /// <param name="DeptId"></param>
 7     private void LoadAddSign( TreeNodeCollection tn, int DeptId) 
 8     {
 9         DataTable table = pagBLL.GetList(" superfuncid=" + DeptId + "  order by sort asc").Tables[0];
10         if (table.Rows.Count > 0)
11         {
12             //加载"一个"1级节点,就是为了显示 + 号
13             tn.Add(new TreeNode());
14 
15         }
16     }
 1     /// <summary>
 2     /// 点击 + 号是节点展开事件
 3   /// 点击某个节点合并其他节点
 4     /// </summary>
 5     /// <param name="sender"></param>
 6     /// <param name="e"></param>
 7     protected void TreeView1_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
 8     {
 9 
10         TreeNode node = e.Node;
11         //点击节点关闭其他节点
12         TreeNodeCollection ts=null;
13         if(node.Parent==null)
14           {
15                ts=((TreeView)sender).Nodes;
16            }
17          else
18           {
19                 ts=node.Parent.ChildNodes;
20              }
21 
22           foreach(TreeNode item in ts)
23          {
24               if(item!=node)
25                  {
26                       item.Collapse();
27                   }
28              }
29 
30 
31         if (node.Expanded == true)
32         {
33             string bm = e.Node.Value.ToString();
34             DataTable table = pagBLL.GetList(" superfuncid=" + bm + "  order by sort asc").Tables[0];
35 
36             node.ChildNodes.Clear(); //清除之前加载的空节点。
37             if (table.Rows.Count > 0)
38             {
39                 for (int i = 0; i < table.Rows.Count; i++)
40                 {
41                     TreeNode Node = new TreeNode();
42                     Node.Text = table.Rows[i]["funcname"].ToString();
43                     Node.Value = table.Rows[i]["pagefuncid"].ToString();
44                     Node.ToolTip = table.Rows[i]["funcurl"].ToString();
45                     Node.ImageUrl = "../../" + table.Rows[i]["imageurl"].ToString();
46                     node.ChildNodes.Add(Node);//增加父节点,这时直接往树TreeView1上加
47                     this.LoadAddSign(Node.ChildNodes, Convert.ToInt32(table.Rows[i]["pagefuncid"].ToString()));
48                 }
49 
50             }
51         }
52 
53     }

原文地址:https://www.cnblogs.com/softwaredeveloper/p/7813637.html