代码如:
<iewc:TreeView id="TreeView1" AutoPostBack="True" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 16px" runat="server">
<iewc:TreeNode CheckBox="True" Text="John Smith">
<iewc:TreeNode CheckBox="True" Text="Born: Jan. 3rd, 1885"></iewc:TreeNode>
<iewc:TreeNode CheckBox="True" Text="Died: Feb. 13, 1919"></iewc:TreeNode>
<iewc:TreeNode CheckBox="True" Text="Spouse">
<iewc:TreeNode CheckBox="True" Text="Marie Ellsworth">
<iewc:TreeNode CheckBox="True" Text="Born: Aug. 1, 1889"></iewc:TreeNode>
<iewc:TreeNode CheckBox="True" Text="Died: Unknown"></iewc:TreeNode>
</iewc:TreeNode>
/// <summary>
/// 如果该节点是叶子节点,就检查该叶子节点的父节点是否被选中,如果没有将父结点设为选中状态。
/// 如果该节点是父节点点,就检查该父节点点的父节点是否被选中,如果没有将父结点的父节点设为选中状态。
/// 如果是取消该叶子节点,则检测该叶子节点的所有兄弟结点是否全部没有被选中。如果是就取消该节点的父结点的选中状态
/// 如果点击的是父结点,则将该节点的所有字节点设置为该节点相同的状态
/// </summary>
private void checkAllChild(TreeNode node)
{
this.treeView1.AfterCheck -= new System.Windows.Forms.TreeViewEventHandler(treeView1_AfterCheck);
TreeNode TempNode = null;
TreeNode TempNode1 = null;
bool bNodeStatus = false;
if(node.Nodes.Count == 0) //该节点是叶子节点
{
bNodeStatus = node.Checked;
if(bNodeStatus) //如果该节点被选中则将该节点父节点设置成为选中状态
{
TempNode = node.Parent;
while(TempNode != null) //将它的所有父节点设定为选中状态
{
TempNode.Checked = true;
TempNode = TempNode.Parent;
}
}
else //如果是取消对该节点的选中状态
{
TempNode1 = node;
TempNode = node.Parent;
while(TempNode != null)
{
if(this.CheckCurrentLevelStatus(TempNode1) == -1) //如果全部是未选中状态
{
TempNode1.Parent.Checked = false; //取消该节点的父节点的选中状态
}
TempNode1 = TempNode;
TempNode = TempNode.Parent;
}
}
}
else //如果操作的不是叶子节点
{
for(int i=0;i<node.Nodes.Count;i++) //将父节点的所有子节点设置成父节点相同的状态
{
node.Nodes[i].Checked = node.Checked;
this.treeView1.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(treeView1_AfterCheck);
checkAllChild(node.Nodes[i]);
this.treeView1.AfterCheck -= new System.Windows.Forms.TreeViewEventHandler(treeView1_AfterCheck);
}
if(node.Checked == false) //如果是取消对非叶子节点的选中
{
TempNode1 = node;
TempNode = node.Parent;
while(TempNode != null)
{
if(this.CheckCurrentLevelStatus(TempNode1) == -1) //如果全部是未选中状态
{
TempNode1.Parent.Checked = false; //取消该节点的父节点的选中状态
}
TempNode1 = TempNode;
TempNode = TempNode.Parent;
}
}
}
this.treeView1.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(treeView1_AfterCheck);
}
/// <summary>
/// 函数功能: 检测与node同级的所有节点的状态
/// 如果全部被选中返回 1
/// 如果全部没有被选中返回 -1
/// 其它情况返回 0
/// </summary>
private int CheckCurrentLevelStatus(TreeNode node)
{
int CheckedCount = 0; //记录被选中的节点的数目
int unCheckedCount = 0; //记录未被选中的节点的数目
TreeNode tempNode = null;
tempNode = node.Parent.FirstNode;
while(tempNode != null)
{
if(tempNode.Checked)
{
CheckedCount++;
}
else
{
unCheckedCount++;
}
tempNode = tempNode.NextNode;
}
if((CheckedCount != 0) && (unCheckedCount != 0))
{
return 0;
}
else if(CheckedCount == 0)
{
return -1;
}
else
{
return 1;
}
}
private void treeView1_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
this.checkAllChild(e.Node);
}
}
}