TreeView客户端个性化控制

    asp.net 2.0 的 TreeView 控件功能虽说强大,但其客户端控制很逊色,本文将讲解 TreeView 的客户端实现原理,并实现两个个性化操作:
(1) 节点的全部打开和关闭;
TreeNode Expand(or Collapse) all
(2) 只打开一个节点(关闭其他兄弟节点)。
just one node expanded(when a client expand one node all other will collaps)

用记事本打开页面源代码,可以找到一下两个脚本引用:

TreeView客户端个性化控制 < script  src ="/WebUI/WebResource.axd?d=RAQeBcDUNuP9iuS8q3tNEw2&amp;t=633300220640000000"  type ="text/javascript" ></ script >
TreeView客户端个性化控制
< script  src ="/WebUI/WebResource.axd?d=JuTdJhq3NM8Jq_RhssAkEg2&amp;t=633300220640000000"  type ="text/javascript" ></ script >

    将"/WebUI/WebResource.axd?d=RAQeBcDUNuP9iuS8q3tNEw2&amp;t=633300220640000000"拷到地址栏尾,下载脚本,并以 .js 命名,另一个同样操作。分析第二个脚本文件,可以看到TreeView的很多客户端函数,其中关键的一个 TreeView_ToggleNode 就是客户端点击时触发的事件。
    要想做个性化的操作,就得从 TreeView_ToggleNode 事件下手。我们无法更改.net封装好的脚本,只有“重写”。所谓的重写就是在原来的函数之后添加一个同名函数(因为js对于同名函数只调用最后一个)。

TreeView_ToggleNode 的原函数:

TreeView客户端个性化控制 function  TreeView_ToggleNode(data, index, node, lineType, children)  {
TreeView客户端个性化控制    
var img = node.childNodes[0];
TreeView客户端个性化控制    
var newExpandState;
TreeView客户端个性化控制    
try {
TreeView客户端个性化控制        
if (children.style.display == "none"{
TreeView客户端个性化控制            children.style.display 
= "block";
TreeView客户端个性化控制            newExpandState 
= "e";
TreeView客户端个性化控制            
if ((typeof(img) != "undefined"&& (img != null)) {
TreeView客户端个性化控制                
if (lineType == "l"{
TreeView客户端个性化控制                    img.src 
= data.images[15];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                
else if (lineType == "t"{
TreeView客户端个性化控制                    img.src 
= data.images[12];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                
else if (lineType == "-"{
TreeView客户端个性化控制                    img.src 
= data.images[18];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                
else {
TreeView客户端个性化控制                    img.src 
= data.images[5];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                img.alt 
= data.collapseToolTip.replace(/\{0\}/, TreeView_GetNodeText(node));
TreeView客户端个性化控制            }

TreeView客户端个性化控制        }

TreeView客户端个性化控制        
else {
TreeView客户端个性化控制            children.style.display 
= "none";
TreeView客户端个性化控制            newExpandState 
= "c";
TreeView客户端个性化控制            
if ((typeof(img) != "undefined"&& (img != null)) {
TreeView客户端个性化控制                
if (lineType == "l"{
TreeView客户端个性化控制                    img.src 
= data.images[14];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                
else if (lineType == "t"{
TreeView客户端个性化控制                    img.src 
= data.images[11];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                
else if (lineType == "-"{
TreeView客户端个性化控制                    img.src 
= data.images[17];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                
else {
TreeView客户端个性化控制                    img.src 
= data.images[4];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                img.alt 
= data.expandToolTip.replace(/\{0\}/, TreeView_GetNodeText(node));
TreeView客户端个性化控制            }

TreeView客户端个性化控制        }

TreeView客户端个性化控制    }

TreeView客户端个性化控制    
catch(e) {}
TreeView客户端个性化控制    data.expandState.value 
=  data.expandState.value.substring(0, index) + newExpandState + data.expandState.value.slice(index + 1);
TreeView客户端个性化控制}

1. 节点的全部打开和关闭:

TreeView客户端个性化控制 < html  xmlns ="http://www.w3.org/1999/xhtml" >
TreeView客户端个性化控制
< head  runat ="server" >
TreeView客户端个性化控制    
< title > LeftMenu_Tree </ title >
TreeView客户端个性化控制
</ head >
TreeView客户端个性化控制
< body  bgcolor ="#DDEDFD" >
TreeView客户端个性化控制    
< form  id ="form1"  runat ="server" >
TreeView客户端个性化控制        
< href ="javascript:TreeviewExpandCollapseAll('<%=TreeView1.ClientID%>', true)" > Expand
TreeView客户端个性化控制            All
</ a >   < href ="javascript:TreeviewExpandCollapseAll('<%=TreeView1.ClientID%>', false)" >
TreeView客户端个性化控制                Collapse All
</ a >
TreeView客户端个性化控制        
< asp:TreeView  ID ="TreeView1"  SkinID ="tvClass"  runat ="server"  ShowLines ="true"  NodeWrap ="false" >
TreeView客户端个性化控制        
</ asp:TreeView >
TreeView客户端个性化控制    
</ form >
TreeView客户端个性化控制
</ body >
TreeView客户端个性化控制
</ html >
TreeView客户端个性化控制
TreeView客户端个性化控制
< script  language ="javascript" >
TreeView客户端个性化控制
//-----------------------------------------------------------------------------
TreeView客户端个性化控制
function $(s){return document.getElementById(s);}
TreeView客户端个性化控制
function isNull(_sVal){return (_sVal == "" || _sVal == null || _sVal == "undefined");}
TreeView客户端个性化控制
TreeView客户端个性化控制
function TreeviewExpandCollapseAll(treeViewId, expandAll)
TreeView客户端个性化控制
{
TreeView客户端个性化控制    
var displayState = (expandAll == true ? "none" : "block");
TreeView客户端个性化控制    
var treeView = $(treeViewId);
TreeView客户端个性化控制    
if(treeView)
TreeView客户端个性化控制    
{
TreeView客户端个性化控制        
var treeLinks = treeView.getElementsByTagName("a");
TreeView客户端个性化控制        
var nodeCount = treeLinks.length;
TreeView客户端个性化控制        
var flag = true;
TreeView客户端个性化控制        
for(i=0;i<nodeCount;i++)
TreeView客户端个性化控制        
{
TreeView客户端个性化控制            
if(treeLinks[i].firstChild.tagName)
TreeView客户端个性化控制            
{
TreeView客户端个性化控制                
if(treeLinks[i].firstChild.tagName.toLowerCase() == "img")
TreeView客户端个性化控制                
{
TreeView客户端个性化控制                    
var node = treeLinks[i];
TreeView客户端个性化控制                    
var level = parseInt(node.id.substr(node.id.length - 1),10);
TreeView客户端个性化控制                    
var childContainer = GetParentByTagName("table", node).nextSibling;
TreeView客户端个性化控制                    
if(!isNull(childContainer))
TreeView客户端个性化控制                    
{
TreeView客户端个性化控制                        
if(flag)
TreeView客户端个性化控制                        
{
TreeView客户端个性化控制                            
if(childContainer.style.display == displayState)
TreeView客户端个性化控制                            
{
TreeView客户端个性化控制                                TreeView_ToggleNode(eval(treeViewId 
+"_Data"),level,node,'r',childContainer);
TreeView客户端个性化控制                            }

TreeView客户端个性化控制                            flag 
= false;
TreeView客户端个性化控制                        }

TreeView客户端个性化控制                        
else
TreeView客户端个性化控制                        
{
TreeView客户端个性化控制                            
if(childContainer.style.display == displayState)
TreeView客户端个性化控制                            
{
TreeView客户端个性化控制                                TreeView_ToggleNode(eval(treeViewId 
+"_Data"),level,node,'l',childContainer);
TreeView客户端个性化控制                            }

TreeView客户端个性化控制                        }

TreeView客户端个性化控制                    }

TreeView客户端个性化控制                }

TreeView客户端个性化控制            }

TreeView客户端个性化控制        }
//for loop ends
TreeView客户端个性化控制
    }

TreeView客户端个性化控制}

TreeView客户端个性化控制
TreeView客户端个性化控制
function GetParentByTagName(parentTagName, childElementObj)
TreeView客户端个性化控制
{
TreeView客户端个性化控制    
var parent = childElementObj.parentNode;
TreeView客户端个性化控制    
while(parent.tagName.toLowerCase() != parentTagName.toLowerCase())
TreeView客户端个性化控制    
{
TreeView客户端个性化控制        parent 
= parent.parentNode;
TreeView客户端个性化控制    }

TreeView客户端个性化控制    
return parent;
TreeView客户端个性化控制}

TreeView客户端个性化控制
//-----------------------------------------------------------------------------
TreeView客户端个性化控制
</ script >
2. 只打开一个节点(关闭其他兄弟节点)
TreeView客户端个性化控制 < html  xmlns ="http://www.w3.org/1999/xhtml" >
TreeView客户端个性化控制
< head  runat ="server" >
TreeView客户端个性化控制    
< title > LeftMenu_Tree </ title >
TreeView客户端个性化控制
</ head >
TreeView客户端个性化控制
< body  bgcolor ="#DDEDFD" >
TreeView客户端个性化控制    
< form  id ="form1"  runat ="server" >
TreeView客户端个性化控制        
< href ="javascript:TreeviewExpandCollapseAll('<%=TreeView1.ClientID%>', true)" > Expand
TreeView客户端个性化控制            All
</ a >  ,  < href ="javascript:TreeviewExpandCollapseAll('<%=TreeView1.ClientID%>', false)" >
TreeView客户端个性化控制                Collapse All
</ a >
TreeView客户端个性化控制        
< asp:TreeView  ID ="TreeView1"  SkinID ="tvClass"  runat ="server"  ShowLines ="true"  NodeWrap ="false" >
TreeView客户端个性化控制        
</ asp:TreeView >
TreeView客户端个性化控制    
</ form >
TreeView客户端个性化控制
</ body >
TreeView客户端个性化控制
</ html >
TreeView客户端个性化控制
TreeView客户端个性化控制
< script  language ="javascript" >
TreeView客户端个性化控制
//2. 只打开一个节点(关闭其他兄弟节点)------------------------------------------
TreeView客户端个性化控制
function TreeView_ToggleNode(data, index, node, lineType, children) 
TreeView客户端个性化控制
{
TreeView客户端个性化控制    
var img = node.childNodes[0];
TreeView客户端个性化控制    
var newExpandState;
TreeView客户端个性化控制    
try {
TreeView客户端个性化控制        
//***折叠兄弟节点------------------------
TreeView客户端个性化控制
        CollapseBrothers(data,children);
TreeView客户端个性化控制        
//---------------------------------------
TreeView客户端个性化控制
            
TreeView客户端个性化控制        
if (children.style.display == "none"
TreeView客户端个性化控制        
{
TreeView客户端个性化控制            children.style.display 
= "block";
TreeView客户端个性化控制            newExpandState 
= "e";
TreeView客户端个性化控制            
if ((typeof(img) != "undefined"&& (img != null)) 
TreeView客户端个性化控制            
{
TreeView客户端个性化控制                
if (lineType == "l"
TreeView客户端个性化控制                
{
TreeView客户端个性化控制                    img.src 
= data.images[15];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                
else if (lineType == "t"
TreeView客户端个性化控制                
{
TreeView客户端个性化控制                    img.src 
= data.images[12];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                
else if (lineType == "-"
TreeView客户端个性化控制                
{
TreeView客户端个性化控制                    img.src 
= data.images[18];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                
else 
TreeView客户端个性化控制                
{
TreeView客户端个性化控制                    img.src 
= data.images[5];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                img.alt 
= data.collapseToolTip.replace(/\{0\}/, TreeView_GetNodeText(node));
TreeView客户端个性化控制            }

TreeView客户端个性化控制        }

TreeView客户端个性化控制        
else 
TreeView客户端个性化控制        
{
TreeView客户端个性化控制            children.style.display 
= "none";
TreeView客户端个性化控制            newExpandState 
= "c";
TreeView客户端个性化控制            
if ((typeof(img) != "undefined"&& (img != null)) 
TreeView客户端个性化控制            
{
TreeView客户端个性化控制                
if (lineType == "l"
TreeView客户端个性化控制                
{
TreeView客户端个性化控制                    img.src 
= data.images[14];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                
else if (lineType == "t"
TreeView客户端个性化控制                
{
TreeView客户端个性化控制                    img.src 
= data.images[11];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                
else if (lineType == "-"
TreeView客户端个性化控制                
{
TreeView客户端个性化控制                    img.src 
= data.images[17];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                
else 
TreeView客户端个性化控制                
{
TreeView客户端个性化控制                    img.src 
= data.images[4];
TreeView客户端个性化控制                }

TreeView客户端个性化控制                img.alt 
= data.expandToolTip.replace(/\{0\}/, TreeView_GetNodeText(node));
TreeView客户端个性化控制            }

TreeView客户端个性化控制        }

TreeView客户端个性化控制    }

TreeView客户端个性化控制    
catch(e) {}
TreeView客户端个性化控制    data.expandState.value 
=  data.expandState.value.substring(0, index) + newExpandState + data.expandState.value.slice(index + 1);
TreeView客户端个性化控制}

TreeView客户端个性化控制
TreeView客户端个性化控制
//折叠兄弟节点
TreeView客户端个性化控制
function CollapseBrothers(data,childContainer)
TreeView客户端个性化控制
{
TreeView客户端个性化控制    
var parent = childContainer.parentNode;   
TreeView客户端个性化控制    
for(i=0; i< parent.childNodes.length; i++)
TreeView客户端个性化控制    
{
TreeView客户端个性化控制        
if(parent.childNodes[i].tagName.toLowerCase() =="div")
TreeView客户端个性化控制        
{
TreeView客户端个性化控制            
if(parent.childNodes[i].id != childContainer.id)
TreeView客户端个性化控制            
{
TreeView客户端个性化控制                parent.childNodes[i].style.display 
= "none"
TreeView客户端个性化控制            }

TreeView客户端个性化控制        }

TreeView客户端个性化控制        
else if(parent.childNodes[i].tagName.toLowerCase() =="table")
TreeView客户端个性化控制        
{
TreeView客户端个性化控制            
var treeLinks = parent.childNodes[i].getElementsByTagName("a");            
TreeView客户端个性化控制            
if(treeLinks.length > 2)
TreeView客户端个性化控制            
{
TreeView客户端个性化控制                
var j=0;
TreeView客户端个性化控制                
if(treeLinks[j].firstChild.tagName)
TreeView客户端个性化控制                
{
TreeView客户端个性化控制                    
if(treeLinks[j].firstChild.tagName.toLowerCase() == "img")
TreeView客户端个性化控制                    
{
TreeView客户端个性化控制                        
var img = treeLinks[j].firstChild;
TreeView客户端个性化控制                        
if(i==0
TreeView客户端个性化控制                            img.src 
= data.images[8];
TreeView客户端个性化控制                        
else if(i==parent.childNodes.length-2
TreeView客户端个性化控制                            img.src 
= data.images[14];
TreeView客户端个性化控制                        
else 
TreeView客户端个性化控制                            img.src 
= data.images[11];
TreeView客户端个性化控制                    }

TreeView客户端个性化控制                }
    
TreeView客户端个性化控制            }

TreeView客户端个性化控制        }
        
TreeView客户端个性化控制    }

TreeView客户端个性化控制}

TreeView客户端个性化控制
//-----------------------------------------------------------------------------
TreeView客户端个性化控制
</ script >

你可能感兴趣的:(treeview)