在使用TreeView控件的时候,如果数据量太大,这个TreeView控件加载会很慢,有时甚至加载失败,
为了更好的使用TreeView控件加载大量的数据,采用异步延迟加载TreeView。
在TreeView每个结点的前面都有个"+"号,点击这个”+“号触发的事件是OnTreeNodeExpanded="TreeView1_TreeNodeExpanded" ,在刚开始加载TreeView的时候,如果结点下面
还有子节点的话,只加载一个子节点;在点击”+“号,触发OnTreeNodeExpanded事件的时候,再加载该结点下的
所有子节点,这样速度就很快了。
1、前台的显示TreeView代码如下:
- <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>
注明:可以通过selectNode控制选择结点的背景颜色。
2、后台的TreeNodeExpanded事件代码如下:
- protected void TreeView1_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
- {
- //只显示当前结点的子节点,其他结点闭合
- TreeNodeCollection tnc = null;
- if (e.Node.Parent == null)
- {
- tnc = ((TreeView)sender).Nodes;
- }
- else
- tnc = e.Node.Parent.ChildNodes;
- foreach (TreeNode node1 in tnc)
- {
- if (node1 != e.Node)
- {
- node1.Collapse();
- }
- }
- TreeNode node = (TreeNode)e.Node;
- //其中tempNodeInfo包括结点的信息
- string tempNodeInfo = node.Value;
- if (!tempNodeInfo.StartsWith("-1"))
- {
- //先将上次绑定的一个节点信息删除掉
- node.ChildNodes.Clear();
- string[] tempNodeFlag = tempNodeInfo.Split(',');
- if (tempNodeFlag[2].ToString().Equals("小区号"))
- {
- PopulateTreeViewFromFloorName("1", node, Convert.ToInt32(tempNodeFlag[4]), "1");
- }
- else if (tempNodeFlag[2].ToString().Trim().Equals("楼号"))
- {
- PopulateTreeViewFromUnit("2", node, Convert.ToInt32(tempNodeFlag[4]), Convert.ToInt32(tempNodeFlag[5]), "1");
- }
- else if (tempNodeFlag[2].ToString().Trim().Equals("单元号"))
- {
- PopulateTreeViewFromRoomUserTree("3", node, Convert.ToInt32(tempNodeFlag[4]), Convert.ToInt32(tempNodeFlag[5]), Convert.ToInt32(tempNodeFlag[6]), "1");
- }
- }
- }
注明:其中的PopulateTreeViewFromFloorName、PopulateTreeViewFromUnit、
PopulateTreeViewFromRoomUserTree的第四个参数”1“是TreeView1_TreeNodeExpanded事件触发
的标志位,根据这个标志位延迟加载。
通过这样的思路就可以实现异步延迟加载的效果。
以上内容转自:http://blog.csdn.net/wl_ldy/article/details/5732056