asp.net 2.0 的 TreeView 控件功能虽说强大,但其客户端控制很逊色,本文将讲解 TreeView 的客户端实现原理,并实现两个个性化操作:
(1) 节点的全部打开和关闭;
Client Side Expand/Collapse All Nodes For ASP.NET 2.0 TreeView.
(2) 只打开一个节点(关闭其他兄弟节点)。
Just one expanded node in ASP.NET 2.0 TreeView (When a client expand one node all other will collaps)
用记事本打开页面源代码,可以找到一下两个脚本引用:
<
script
src
="/WebUI/WebResource.axd?d=RAQeBcDUNuP9iuS8q3tNEw2&t=633300220640000000"
type
="text/javascript"
></
script
>
<
script
src
="/WebUI/WebResource.axd?d=JuTdJhq3NM8Jq_RhssAkEg2&t=633300220640000000"
type
="text/javascript"
></
script
>
将"/WebUI/WebResource.axd?d=RAQeBcDUNuP9iuS8q3tNEw2&t=633300220640000000"拷到地址栏尾,下载脚本,并以 .js 命名,另一个同样操作。分析第二个脚本文件,可以看到TreeView的很多客户端函数,其中关键的一个 TreeView_ToggleNode 就是客户端点击时触发的事件。
要想做个性化的操作,就得从 TreeView_ToggleNode 事件下手。我们无法更改.net封装好的脚本,只有“重写”。所谓的重写就是在原来的函数之后添加一个同名函数(因为js对于同名函数只调用最后一个)。
TreeView_ToggleNode 的原函数:
function
TreeView_ToggleNode(data, index, node, lineType, children)
{
var img = node.childNodes[0];
var newExpandState;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (children.style.display == "none")
{
children.style.display = "block";
newExpandState = "e";
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if ((typeof(img) != "undefined") && (img != null))
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (lineType == "l")
{
img.src = data.images[15];
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
else if (lineType == "t")
{
img.src = data.images[12];
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
else if (lineType == "-")
{
img.src = data.images[18];
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
else
{
img.src = data.images[5];
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
img.alt = data.collapseToolTip.replace(/\
{0\}/, TreeView_GetNodeText(node));
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
else
{
children.style.display = "none";
newExpandState = "c";
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if ((typeof(img) != "undefined") && (img != null))
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (lineType == "l")
{
img.src = data.images[14];
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
else if (lineType == "t")
{
img.src = data.images[11];
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
else if (lineType == "-")
{
img.src = data.images[17];
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
else
{
img.src = data.images[4];
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
img.alt = data.expandToolTip.replace(/\
{0\}/, TreeView_GetNodeText(node));
}
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
catch(e)
{}
data.expandState.value = data.expandState.value.substring(0, index) + newExpandState + data.expandState.value.slice(index + 1);
}
1. 节点的全部打开和关闭(Client Side Expand/Collapse All Nodes)
<
html
xmlns
="http://www.w3.org/1999/xhtml"
>
<
head
runat
="server"
>
<
title
>
LeftMenu_Tree
</
title
>
</
head
>
<
body
bgcolor
="#DDEDFD"
>
<
form
id
="form1"
runat
="server"
>
<
a
href
="javascript:TreeviewExpandCollapseAll('<%=TreeView1.ClientID%>', true)"
>
Expand
All
</
a
>
<
a
href
="javascript:TreeviewExpandCollapseAll('<%=TreeView1.ClientID%>', false)"
>
Collapse All
</
a
>
<
asp:TreeView
ID
="TreeView1"
SkinID
="tvClass"
runat
="server"
ShowLines
="true"
NodeWrap
="false"
>
</
asp:TreeView
>
</
form
>
</
body
>
</
html
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<
script
language
="javascript"
>
//-----------------------------------------------------------------------------
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
function $(s)
{return document.getElementById(s);}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
function isNull(_sVal)
{return (_sVal == "" || _sVal == null || _sVal == "undefined");}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
function TreeviewExpandCollapseAll(treeViewId, expandAll)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
var displayState = (expandAll == true ? "none" : "block");
var treeView = $(treeViewId);
if(treeView)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
var treeLinks = treeView.getElementsByTagName("a");
var nodeCount = treeLinks.length;
var flag = true;
for(i=0;i<nodeCount;i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(treeLinks[i].firstChild.tagName)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(treeLinks[i].firstChild.tagName.toLowerCase() == "img")
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
var node = treeLinks[i];
var level = parseInt(node.id.substr(node.id.length - 1),10);
var childContainer = GetParentByTagName("table", node).nextSibling;
if(!isNull(childContainer))
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(flag)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(childContainer.style.display == displayState)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
TreeView_ToggleNode(eval(treeViewId +"_Data"),level,node,'r',childContainer);
}
flag = false;
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(childContainer.style.display == displayState)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
TreeView_ToggleNode(eval(treeViewId +"_Data"),level,node,'l',childContainer);
}
}
}
}
}
}//for loop ends
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
function GetParentByTagName(parentTagName, childElementObj)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
var parent = childElementObj.parentNode;
while(parent.tagName.toLowerCase() != parentTagName.toLowerCase())
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
parent = parent.parentNode;
}
return parent;
}
//-----------------------------------------------------------------------------
</
script
>
2. 只打开一个节点,关闭其他兄弟节点(Just one expanded node, all other will collaps)
<
html
xmlns
="http://www.w3.org/1999/xhtml"
>
<
head
runat
="server"
>
<
title
>
LeftMenu_Tree
</
title
>
</
head
>
<
body
bgcolor
="#DDEDFD"
>
<
form
id
="form1"
runat
="server"
>
<
a
href
="javascript:TreeviewExpandCollapseAll('<%=TreeView1.ClientID%>', true)"
>
Expand
All
</
a
>
,
<
a
href
="javascript:TreeviewExpandCollapseAll('<%=TreeView1.ClientID%>', false)"
>
Collapse All
</
a
>
<
asp:TreeView
ID
="TreeView1"
SkinID
="tvClass"
runat
="server"
ShowLines
="true"
NodeWrap
="false"
>
</
asp:TreeView
>
</
form
>
</
body
>
</
html
>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<
script
language
="javascript"
>
//2. 只打开一个节点,关闭其他兄弟节点(Just one expanded node, all other will collaps)
function TreeView_ToggleNode(data, index, node, lineType, children)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
var img = node.childNodes[0];
var newExpandState;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
//***折叠兄弟节点(Collapse Brothers)-----
CollapseBrothers(data,children);
//---------------------------------------
if (children.style.display == "none")
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
children.style.display = "block";
newExpandState = "e";
if ((typeof(img) != "undefined") && (img != null))
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (lineType == "l")
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
img.src = data.images[15];
}
else if (lineType == "t")
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
img.src = data.images[12];
}
else if (lineType == "-")
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
img.src = data.images[18];
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
img.src = data.images[5];
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
img.alt = data.collapseToolTip.replace(/\
{0\}/, TreeView_GetNodeText(node));
}
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
children.style.display = "none";
newExpandState = "c";
if ((typeof(img) != "undefined") && (img != null))
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (lineType == "l")
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
img.src = data.images[14];
}
else if (lineType == "t")
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
img.src = data.images[11];
}
else if (lineType == "-")
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
img.src = data.images[17];
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
img.src = data.images[4];
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
img.alt = data.expandToolTip.replace(/\
{0\}/, TreeView_GetNodeText(node));
}
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
catch(e)
{}
data.expandState.value = data.expandState.value.substring(0, index) + newExpandState + data.expandState.value.slice(index + 1);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//折叠兄弟节点(Collapse Brothers)
function CollapseBrothers(data,childContainer)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
var parent = childContainer.parentNode;
for(i=0; i< parent.childNodes.length; i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(parent.childNodes[i].tagName.toLowerCase() =="div")
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(parent.childNodes[i].id != childContainer.id)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
parent.childNodes[i].style.display = "none"
}
}
else if(parent.childNodes[i].tagName.toLowerCase() =="table")
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
var treeLinks = parent.childNodes[i].getElementsByTagName("a");
if(treeLinks.length > 2)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
var j=0;
if(treeLinks[j].firstChild.tagName)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(treeLinks[j].firstChild.tagName.toLowerCase() == "img")
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
var img = treeLinks[j].firstChild;
if(i==0)
img.src = data.images[8];
else if(i==parent.childNodes.length-2)
img.src = data.images[14];
else
img.src = data.images[11];
}
}
}
}
}
}
//-----------------------------------------------------------------------------
</
script
>