TreeView完全解决方案

时间:2023-01-16 19:45:08
最近使用TreeView控件来实现权限的管理与分配,遇到了很多问题。使用TreeView控件主要需要解决的问题有:
  1. 控制级联checkbox的选择、同步
  2. 结点点击展开下级结点
问题一的解决可以通过修改TreeView.htc文件来完成:
在TreeView.htc中,找到 doCheckboxClick( ),在其中添加设置其他节点状态的处理方法,如下:
// 
// doCheckboxClick()
//
function doCheckboxClick(el)
{
    el.checked = !el.checked;
    var evt = createEventObject();
    evt.treeNodeIndex = getNodeIndex(el);
    g_nodeClicked = el;
    tvevtCheck.fire(evt);
    setTreeNodeState(el);
}
function setTreeNodeState(el)
{
 var state = private_getAttribute(el,"checked");
 //设置子节点选中
 _setChildNode(el,state);
 //设置父节点选中
 _setParentNode(el,state);
}
//设置子节点状态
function  _setChildNode(el,state)
{
 var childNodes = el.children.tags("treenode");
 if(childNodes.length > 0)
 {// if has childs
  for(var i = 0 ;i<=childNodes.length-1;i++)
  {
   cNode = childNodes[i];
   private_setAttribute(childNodes[i],"Checked",state);
   _saveCheckState(childNodes[i]);
   _setChildNode(childNodes[i],state);
  }
 }
}
function  _setParentNode(el,state)
{
 var parentNode = el.parentElement;
 if(parentNode!=null&&private_getAttribute(parentNode,"tagname")=="treenode")
 {
  if(!_checkSiblingdNode(el))
  {
   private_setAttribute(parentNode,"Checked",state);
   _saveCheckState(parentNode);
   _setParentNode(parentNode,state);
  }
 }
}
function _checkSiblingdNode(el)
{
    var parentNode = el.parentElement;
    var siblingNodes = parentNode.children.tags("treenode");
    for(var i = 0;i<=siblingNodes.length-1;i++)
    {
  var cNode = siblingNodes[i];
  if(el != cNode)
  {
      if(private_getAttribute(cNode,"Checked"))
      {
    return true;
      }
  }
 }
 return false;
}

function _saveCheckState(el)
{
 if(getNodeIndex(el))
  queueEvent('oncheck', getNodeIndex(el));
}
// doCheckboxClick()
//
function doCheckboxClick(el)
{
    el.checked = !el.checked;
    var evt = createEventObject();
    evt.treeNodeIndex = getNodeIndex(el);
    g_nodeClicked = el;
    tvevtCheck.fire(evt);
    setTreeNodeState(el);
}
function setTreeNodeState(el)
{
 var state = private_getAttribute(el,"checked");
 //设置子节点选中
 _setChildNode(el,state);
 //设置父节点选中
 _setParentNode(el,state);
}
//设置子节点状态
function  _setChildNode(el,state)
{
 var childNodes = el.children.tags("treenode");
 if(childNodes.length > 0)
 {// if has childs
  for(var i = 0 ;i<=childNodes.length-1;i++)
  {
   cNode = childNodes[i];
   private_setAttribute(childNodes[i],"Checked",state);
   _saveCheckState(childNodes[i]);
   _setChildNode(childNodes[i],state);
  }
 }
}
function  _setParentNode(el,state)
{
 var parentNode = el.parentElement;
 if(parentNode!=null&&private_getAttribute(parentNode,"tagname")=="treenode")
 {
  if(!_checkSiblingdNode(el))
  {
   private_setAttribute(parentNode,"Checked",state);
   _saveCheckState(parentNode);
   _setParentNode(parentNode,state);
  }
 }
}
function _checkSiblingdNode(el)
{
    var parentNode = el.parentElement;
    var siblingNodes = parentNode.children.tags("treenode");
    for(var i = 0;i<=siblingNodes.length-1;i++)
    {
  var cNode = siblingNodes[i];
  if(el != cNode)
  {
      if(private_getAttribute(cNode,"Checked"))
      {
    return true;
      }
  }
 }
 return false;
}

function _saveCheckState(el)
{
 if(getNodeIndex(el))
  queueEvent('oncheck', getNodeIndex(el));
}