经典实例--客户端操作带CheckBox的TreeView(2)--选择子节点后自动选择父节点;取消子节点后根据情况的递归取消父节点。
经典实例--客户端操作带CheckBox的TreeView(2)--选择子节点后自动选择父节点;取消子节点后根据情况的递归取消父节点。
把前面的tree_oncheck()修改一下,然后增加两个方法setParent()和checkBrother(),代码如下:
//节点的oncheck事件
function tree_oncheck(tree)
![]()
![]()
{
var node=tree.getTreeNode(tree.clickedNodeIndex);
var Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("checked");
setcheck(node,Pchecked);
setParent(node,Pchecked);//如果是选择那么选择其父接点.
document.all.checkedNodes.value="";
document.all.unchecked.value="";
FindCheckedFromNode(TreeView1);
}
![]()
//设置子节点选中/取消;
//同时需要设置父节点的状态(如果是取消选中的话,仅仅设置本节点及其所有字接点,不涉及父接点)
function setParent(node,Pc)
![]()
![]()
{
var parentNode = node.getParent();
if(parentNode)
![]()
{
var parentNodeFather = parentNode.getParent();
if(parentNodeFather)
![]()
{
setParent(parentNode,Pc);
}
if(Pc)
![]()
{parentNode.setAttribute("checked",Pc);}
else
![]()
{
checkBrother(parentNode,Pc,node.getAttribute("NodeData"))
}
}
}
//检查子接点是否有选择的,如果有一个选择了,那返回true
//只查第一级节点.
function checkBrother(parentNode,Pc,nodeData)
![]()
![]()
{
var childNodes = new Array();
childNodes = parentNode.getChildren();
if(childNodes.length >0)
![]()
{
var bChecked = true;
for(var i=0;i<childNodes.length;i++)
![]()
{
if(childNodes[i].getAttribute("checked") == true && childNodes[i].getAttribute("NodeData") != nodeData)
![]()
{
//alert(i+childNodes[i].getAttribute("Text"));
bChecked = false;
break;
}
}
if(bChecked)
![]()
{
parentNode.setAttribute("checked",Pc);
}
else
![]()
{
//所有父结点选择
setParent(parentNode,!Pc)
}
}
else
![]()
{
parentNode.setAttribute("checked",Pc);
}
}
![]()
TreeView节点的精确定位问题(通过NodeData来定位)
//Page_Load事件里根据NodeData来展开到到定位的节点
//这里是修改别人的(作者是根据Node的Text定位的.
FindInTree2(Request.QueryString["selectedNodeData"].ToString());
![]()
//根据NodeDate寻找节点
private void FindInTree2(string strNodeData)
![]()
{
foreach (TreeNode tn in TreeView1.Nodes)
![]()
{
if (tn.NodeData != strNodeData)
![]()
{
FindInTree2(tn,strNodeData);
}
else
![]()
{
ExpandTree2(tn);
return;
}
}
}
//根据NodeDate寻找节点
private void FindInTree2(TreeNode objTreeNode,string strNodeData)
![]()
{
foreach (TreeNode tn in objTreeNode.Nodes)
![]()
{
if (tn.NodeData != strNodeData)
![]()
{
![]()
FindInTree2(tn,strNodeData);
}
else
![]()
{
ExpandTree2(tn);
return;
}
}
}
//根据NodeDate展开节点
private void ExpandTree2(TreeNode objTreeNode)
![]()
{
string strIndex = "0";
![]()
objTreeNode.Expanded = true;
![]()
strIndex = objTreeNode.GetNodeIndex();
![]()
while (objTreeNode.Parent is TreeNode)
![]()
{
objTreeNode = ((TreeNode)objTreeNode.Parent);
objTreeNode.Expanded = true;
}
![]()
TreeView1.SelectedNodeIndex = strIndex;
}