private void tvSysFunctionMenu_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Node != tvSysFunctionMenu.Nodes[0])
{
SetChildNodeChecked(e.Node);
SetParentNodeChecked(e.Node);
}
else
{
SetChildNodeChecked(e.Node);
}
}

//根据父节点状态设置子节点的状态
private void SetChildNodeChecked(TreeNode parentNode)
{
foreach (TreeNode node in parentNode.Nodes)
{
node.Checked = parentNode.Checked;
if (node.Nodes.Count > 0)
{
SetChildNodeChecked(node);
}
}
}
//根据子节点状态设置父节点的状态
private void SetParentNodeChecked(TreeNode childNode)
{
TreeNode parentNode = childNode.Parent;
if (!parentNode.Checked && childNode.Checked) //当子结点选中,父结点没选中时,则:选中父结点
{
parentNode.Checked = true;
}
else if (parentNode.Checked && !childNode.Checked) //取消选中其下全部子结点时,其父结点也取消
{
int checks = 0; //统计子结点的个数(为0时表示取消了其下全部子结点)
foreach (TreeNode node in parentNode.Nodes)
{
if (node.Checked)
{
checks++;
break;
}
}
if (checks == 0) //子结点都取消选中时,其父结点也取消
{
parentNode.Checked = false;
if (!parentNode.Index.Equals(0))
{
SetParentNodeChecked(parentNode);
}
}
}
}
//节点选中状态更改
protected void TreeNodeCheckStatusChanged(object sender, TreeNodeMouseClickEventArgs e)
{
SetChildNodeChecked(e.Node);
// 判断是否是根节点
if (!e.Node.Index.Equals(0))
{
SetParentNodeChecked(e.Node);
}
}
本文介绍了一个树状菜单中实现父子节点选中状态同步的方法。通过递归算法确保父节点被选中时其所有子节点也被选中,反之亦然。此外,还考虑了部分选中情况及根节点的特殊处理。
2295

被折叠的 条评论
为什么被折叠?



