最近使用TreeView控件来实现权限的管理与分配,遇到了很多问题。使用TreeView控件主要需要解决的问题有:
-
控制级联checkbox的选择、同步
-
结点点击展开下级结点
问题一的解决可以通过修改TreeView.htc文件来完成:
在TreeView.htc中,找到 doCheckboxClick( ),在其中添加设置其他节点状态的处理方法,如下:
//
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);
{
var state = private_getAttribute(el,"checked");
//设置子节点选中
_setChildNode(el,state);
//设置父节点选中
_setParentNode(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 _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);
}
}
}
{
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;
}
{
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);
{
var state = private_getAttribute(el,"checked");
//设置子节点选中
_setChildNode(el,state);
//设置父节点选中
_setParentNode(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 _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);
}
}
}
{
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;
}
{
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));
}