经典实例--客户端操作带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;
    }
原文地址:https://www.cnblogs.com/newwind521/p/469934.html