最近做一个在TreeView上Check的功能,满足以下两点
1、如果一个Node的Check状态发生变化后,那么它所有的子节点的Check状态都变为和父节点的相同。
2、如果一个Node的Check状态变为True后,那么该节点的所有父节点的Check状态都应该变为True,一直追溯到根节点。以下是我的代码
private void tvTest_AfterCheck( object sender, TreeViewEventArgs e )
{
TreeNode curNode = e.Node;
//改变父节点状态
if ( null != curNode.Parent )
{
if ( curNode.Checked )
{
if ( !curNode.Parent.Checked )
{
curNode.Parent.Checked = true;
}
}
else
{
if ( curNode.Parent.Checked )
{
int i = 0;
for ( i = 0; i < curNode.Parent.Nodes.Count; ++i )
{
if ( curNode.Parent.Nodes[i].Checked )
{
break;
}
} if ( curNode.Parent.Nodes.Count == i )
{
curNode.Parent.Checked = false;
}
}
}
} //改变子节点的Check状态
for ( int i = 0; i < curNode.Nodes.Count; ++i )
{
curNode.Nodes[i].Checked = curNode.Checked;
}
}
}但是现在这个代码最要命的就是,当任一节点的Check为True以后,那么所有节点的Check装态就变为True。原因很简单,当Parent的Check状态变为True后,触发了AfterChecke事件,那么它所有的子节点的Check也变为True,如此反复,就错了。现在不知道有没有什么办法能改变这个问题。一共就70分,全撒了!还请高手知道啊,可能在您看来就是一句话的事,但是我现在就陷里边了。谢谢!
1、如果一个Node的Check状态发生变化后,那么它所有的子节点的Check状态都变为和父节点的相同。
2、如果一个Node的Check状态变为True后,那么该节点的所有父节点的Check状态都应该变为True,一直追溯到根节点。以下是我的代码
private void tvTest_AfterCheck( object sender, TreeViewEventArgs e )
{
TreeNode curNode = e.Node;
//改变父节点状态
if ( null != curNode.Parent )
{
if ( curNode.Checked )
{
if ( !curNode.Parent.Checked )
{
curNode.Parent.Checked = true;
}
}
else
{
if ( curNode.Parent.Checked )
{
int i = 0;
for ( i = 0; i < curNode.Parent.Nodes.Count; ++i )
{
if ( curNode.Parent.Nodes[i].Checked )
{
break;
}
} if ( curNode.Parent.Nodes.Count == i )
{
curNode.Parent.Checked = false;
}
}
}
} //改变子节点的Check状态
for ( int i = 0; i < curNode.Nodes.Count; ++i )
{
curNode.Nodes[i].Checked = curNode.Checked;
}
}
}但是现在这个代码最要命的就是,当任一节点的Check为True以后,那么所有节点的Check装态就变为True。原因很简单,当Parent的Check状态变为True后,触发了AfterChecke事件,那么它所有的子节点的Check也变为True,如此反复,就错了。现在不知道有没有什么办法能改变这个问题。一共就70分,全撒了!还请高手知道啊,可能在您看来就是一句话的事,但是我现在就陷里边了。谢谢!
我这个是C/S的,通过Vs2008做的
不太明白你的意思啊
{
tvTest.AfterCheck -= tvTest_AfterCheck;
try
{
if ( null != e.Node.Parent )
{
ChangeParentCheckState( e.Node.Parent );
} if ( 0 != e.Node.Nodes.Count )
{
foreach ( TreeNode treeNode in e.Node.Nodes )
{
ChangeChildCheckState( treeNode, e.Node.Checked );
}
}
}
finally
{
tvTest.AfterCheck += tvTest_AfterCheck;
}
} /// <summary>
/// 改变父节点的Check状态
/// </summary>
/// <param name="parentNode"></param>
private void ChangeParentCheckState( TreeNode parentNode )
{
parentNode.Checked = true; if ( null != parentNode.Parent )
{ ChangeParentCheckState( parentNode.Parent );
}
} /// <summary>
/// 改变子节点的Check状态
/// </summary>
/// <param name="childNode"></param>
/// <param name="checkState"></param>
private void ChangeChildCheckState( TreeNode childNode, bool checkState )
{
childNode.Checked = checkState;
if ( 0 != childNode.Nodes.Count )
{
foreach ( TreeNode treeNode in childNode.Nodes )
{
ChangeChildCheckState( treeNode, checkState );
}
}
}需要说明的是,如果节点的Check状态变为false的话,只考虑子节点,并没有对父节点进行处理。