在实际工作中经常会遇到树形节点根节点和子节点的同步问题:
1.根节点选中,子节点全部选中
2.子节点有一个没选中,根节点则没选中
3.子节点全部选中,根节点自动选中
见代码:
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
SetChildChecked(e.Node); // 判断是否是根节点
if (e.Node.Parent != null)
{
SetParentChecked(e.Node);
}
}
/// <summary>
/// 根据子节点状态设置父节点的状态
/// </summary>
/// <param name="childNode"></param>
private void SetParentChecked(TreeNode childNode)
{
TreeNode parentNode = childNode.Parent;
if (!parentNode.Checked && childNode.Checked)
{
int ichecks = 0;
for (int i = 0; i < parentNode.GetNodeCount(false); i++)
{
TreeNode node = parentNode.Nodes[i];
if (node.Checked) { ichecks++; }
}
if (ichecks == parentNode.GetNodeCount(false))
{
parentNode.Checked = true;
if (parentNode.Parent != null)
{
SetParentChecked(parentNode);
}
}
}
else if(parentNode.Checked && !childNode.Checked)
{
parentNode.Checked = false;
}
}
/// <summary>
/// 根据父节点状态设置子节点的状态
/// </summary>
/// <param name="parentNode"></param>
private void SetChildChecked(TreeNode parentNode)
{
for (int i = 0; i < parentNode.GetNodeCount(false); i++)
{
TreeNode node = parentNode.Nodes[i];
node.Checked = parentNode.Checked;
if (node.GetNodeCount(false) > 0)
{
SetChildChecked(node);
}
}
}