工作上,当我们碰到Treeview,便要处理父子节点联动这一需求。以下是我写的一些代码。直接复用即可。当然大家若发现有不妥的地方,希望指正....
private void treeView_XM_AfterCheck(object sender, TreeViewEventArgs e)
{
TreeNode treeNode = e.Node;
this.treeView1.AfterCheck -= new System.Windows.Forms.TreeViewEventHandler(this.treeView_XM_AfterCheck);// 代码设置父子关系时候,禁止冒泡事件
SetSonCheckState(treeNode);
SetParentCheckedState(treeNode);
this.treeView1.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.treeView_XM_AfterCheck);
}
protected void SetSonCheckState(TreeNode treeNode)
{
foreach (TreeNode tn in treeNode.Nodes)
{
tn.Checked = treeNode.Checked;
SetSonCheckState(tn);
}
}
/// <summary>
/// 根据子节点状态设置父节点的状态
/// </summary>
/// <param name="childNode"></param>
protected void SetParentCheckedState(TreeNode childNode)
{
TreeNode parentNode = childNode.Parent;
if (parentNode != null)
{
if (!parentNode.Checked && childNode.Checked)
{
int numChecks = 0;
for (int i = 0; i < parentNode.Nodes.Count; i++)
{
TreeNode tn = parentNode.Nodes[i];
if (tn.Checked)
{
numChecks++;
}
}
//此子节点和它所有兄弟节点都选中了
if (numChecks == parentNode.Nodes.Count)
{
parentNode.Checked = true;
SetParentCheckedState(parentNode);
}
}
else if (parentNode.Checked && !childNode.Checked)
{
parentNode.Checked = false;
SetParentCheckedState(parentNode);
}
}
}