Treeview 分级加载方法

先说一下主要原理:
     此处使用OnTreeNodePopulate事件并採用刷新的方式获取数据。第一次加载时获取根结点及其下两级结点,显示根结点和第一级结点,用第二级结点判断第一级结点是否含有结结点,并缓存第二级结点。下次逐级扩展时填加已缓存的第二级结点,并取得第二级结点的所有子结点。

说明:为什么要取第二级数据?
    因为取得第一级数据后,您不知道是否有一下级。所以再取得第一级数据后的下一级数据,并用nodeDictionary 变量缓存所有第二级数据便于下次加载。
    下次点击扩展时,先从变量中找此级的数据,找到后读取此级的下一级数据。

原理比较枯燥,用例子说明:

 1、在页面中放入TreeView。并设置OnTreeNodePopulate事件和EnableClientScript属性。

复制代码
复制代码
< asp:TreeView  ID ="tvDepartment"  runat ="server"  NodeIndent ="10"
    OnTreeNodePopulate
="tvDepartment_TreeNodePopulate"
    EnableClientScript
="False" >
    
< ParentNodeStyle  ForeColor ="#5555DD" />
    
< SelectedNodeStyle  BackColor ="#F2F6FB"   />     
    
< NodeStyle  Font-Size ="12px"  ForeColor ="Black"   />
</ asp:TreeView >
复制代码
复制代码

      此处说明一下EnableClientScript属性。如果EnableClientScript="True",当点击扩展结点时就调用客户端的角本,并不会回发,所取出的值与当前点的值不一致,造成成错误。所以此处要将EnableClientScript属性设为true。

 

2、后台代码(代码中涉及取数据的方法没有给出,您可以根据情况自己编写取数据方法)

复制代码
代码
      // 用于缓存数据
      private   static  Dictionary < string , IList < PW_Department >>  nodeDictionary  =   new  Dictionary < string , IList < PW_Department >> ();
     
protected   void  Page_Load( object  sender, EventArgs e)
        {
            
if  ( ! Page.IsPostBack)
            {
                nodeDictionary.Clear();
                BindDepartmentTree(
this .PwPid,  " system " );               
            }      
        }
        
// 取得根目录的第一级数据
         public   void  BindDepartmentTree( string  pwPid,  string  departmentNo)
        {
            nodeDictionary.Clear();
            UserPower userPower 
=   new  UserPower();
            
// 取得根目录
            PW_Department pwSystem  =  userPower.GetParentDepartment(pwPid, departmentNo);
            tvDepartment.Nodes.Clear();
            
if  (pwSystem  ==   null )
            {
                
return ;
            }
            TreeNode tnRootNode 
=   new  TreeNode();
            tnRootNode.Text 
=  pwSystem.departmentName;
            tnRootNode.Value 
=  pwSystem.departmentNo;
            
// 取得根目录的第一级数据
            IList < PW_Department >  ilPwDepts  =  userPower.GetChildDepartment(PwPid, departmentNo);
            
if  (ilPwDepts  ==   null   ||  ilPwDepts.Count  <   1 )
            {
                
return ;
            }
            
foreach  (PW_Department pdItem  in  ilPwDepts)
            {
                TreeNode tnNewNode 
=   new  TreeNode(pdItem.departmentName, pdItem.departmentNo);
                
// 取得第一级数据下的第二级数据
                IList < PW_Department >  ilChilldDepts  =  userPower.GetChildDepartment(PwPid, pdItem.departmentNo);
                tnRootNode.ChildNodes.Add(tnNewNode);
                
if  (ilChilldDepts  ==   null   ||  ilChilldDepts.Count  <   1 )
                {                    
                }
                
else
                {
                    
// 设置父结点可以扩展
                    tnNewNode.PopulateOnDemand  =   true ;
                    tnNewNode.Expanded 
=   false ;
                    nodeDictionary.Add(pdItem.departmentNo, ilChilldDepts);
                }
            }            
            tvDepartment.Nodes.Add(tnRootNode);
        }
        
// TreeNodePopulate事件,用于分级取数据
         protected   void  tvDepartment_TreeNodePopulate( object  sender, TreeNodeEventArgs e)
        {
            
// 取得当前点击的node的值
             if  (tvDepartment.SelectedNode  !=   null )
            {
                
string  sValue  =  tvDepartment.SelectedNode.Value;
            }            
            UserPower userPower 
=   new  UserPower();
            
string  nodeID  =  e.Node.Value;            
            
if  (nodeDictionary  !=   null )
            {
                
if  (nodeDictionary.Keys.Contains(nodeID))
                {
                    
if  (nodeDictionary[nodeID].Count > 0 )
                    {
                        
// 从缓存中取得当前结点的第一级结点
                         foreach  (PW_Department pdItem  in  nodeDictionary[nodeID])
                        {
                            TreeNode tnNewNode 
=   new  TreeNode(pdItem.departmentName, pdItem.departmentNo);
                         
// 取得当前结点第一级结点下的子结点
                            IList < PW_Department >  ilPwDepts  =  userPower.GetChildDepartment(PwPid, tnNewNode.Value);
                         
// 如果没有子结点,不可以扩展
                             if  (ilPwDepts  ==   null   ||  ilPwDepts.Count  <   1 )
                            {
                                tnNewNode.Expanded 
=   false ;
                                tnNewNode.PopulateOnDemand 
=   false ;
                                tnNewNode.SelectAction 
=  TreeNodeSelectAction.Select;                                
                                e.Node.ChildNodes.Add(tnNewNode);                              
                            }
                            
else
                            {
                                
// 设置父结点可以扩展
                                tnNewNode.PopulateOnDemand  =   true ;
                                tnNewNode.Expanded 
=   false ;
                                tnNewNode.SelectAction 
=  TreeNodeSelectAction.Select;
                                e.Node.ChildNodes.Add(tnNewNode);
                                
// 级存当前结点第一级结点下的子结点
                                nodeDictionary.Add(pdItem.departmentNo, ilPwDepts);
                            }
                        }
                        
// 移除已展开的节点
                        nodeDictionary.Remove(nodeID);
                    }
                }
            }
        }
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值