您的位置:首页 > 其它

保持TreeView父子节点的CheckBox节点状态一致的一种方法

2007-12-07 14:41 543 查看
记得以前在网上有一些关于讨论:如何实现当TreeView节点包含CheckBox时保持其父子节点状态一致,即:当选中父节点,子节点会全部自动选上,反之则全部取消。选择某个子节点,同样应该选中这个字节点的父节点(包括祖先节点)。  
  在网上也找了一些方法,但是我觉得这是TreeView的一个缺陷,因此应该在该控件内部实现,而不应该附加一些外部的js来控制TreeView(个人认为)。所以我决定修改TreeView的实现。  
  我曾在下面这篇文章中介绍了如何实现(http://blog.csdn.net/cuike519/archive/2005/02/02/278271.aspx),但是由于当时时间的关系,有些地方处理的不妥当,最近工作比较轻松,故又将其完善了一下,供网友参考。  
  1、首先需要替换TreeView.htc,我使用的是1.0版本的TreeView.htc,那么先找到这个文件(通常在Inetpub/wwwroot/webctrl_client/1_0下面),或者为TreeView指定合适的路径。  
  2、打开文件,为TreeView控件添加如下的方法:  
  //   add   by   wujian   for   check  
  function     _setChildNode(el,state){  
  var   childNodes   =   el.children;  
  if(childNodes.length   >   0){//   if   has   childs    
  for(var   i   =   0   ;i<=childNodes.length-1;i++){  
  private_setAttribute(childNodes[i],"checked",state);  
  _saveCheckState(childNodes[i]);  
  _setChildNode(childNodes[i],state);  
  }  
  }  
  }  
   
  function     _setParentNode(el,state){  
  var   parentNode   =   el.parentElement;  
  if(parentNode){  
  if(!_checkSiblingdNode(el)){  
  private_setAttribute(parentNode,"checked",state);  
  _saveCheckState(parentNode);  
  _setParentNode(parentNode,state);  
  }  
  }  
  }  
   
  function     setNodeState(el,state){  
  _setChildNode(el,state);  
  _setParentNode(el,state);  
  }  
   
  function   _saveCheckState(el){  
  if(getNodeIndex(el))  
  queueEvent('oncheck',   getNodeIndex(el));  
  }  
   
  function   _checkSiblingdNode(el){  
  var   parentNode   =   el.parentElement;//   you   can   use   getParentTreeNode   function   in   this   htc,but   I   like   this   usage.  
  for(var   i   =   0;i<=parentNode.children.length-1;i++){  
  if(el   !=   parentNode.children[i]){  
  if(private_getAttribute(parentNode.children[i],"Checked")){  
  return   true;  
  }  
  }  
  }  
  return   false;  
  }  
  //   =====end   for   check  
  我将其放在doCheckboxClick函数的后面。  
  3、找到doCheckboxClick函数,并修改这个函数,修改后的函数如下:  
  function   doCheckboxClick(el){  
  if(el.checked   !=   event.srcElement.checked)  
  el.checked   =   event.srcElement.checked;  
  else  
  el.checked   =   !el.checked;  
  var   evt   =   createEventObject();  
  evt.treeNodeIndex   =   getNodeIndex(el);  
  g_nodeClicked   =   el;  
  _tvevtCheck.fire(evt);  
  setNodeState(el,el.checked);  
  }  
  该修改经过测试基本没有问题,希望能给网友一个参考。有什么不对的地方欢迎批评指正。:-)  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  function htc 测试 工作