□aaaaa
□ a
□ b
□ c
□bbbbb
□ d
□ e
□ f
□ g
□ccccc
□ h
□ i
□ j我的TreeView里面的结构看上面.........
我现在想问:
1 选中父节点,选中它下面的所有子节点.........例: 选了aaaaa 就要选中a,b,c
2 取消父节点,取消它下面的所有子节点.....
3 选中一个子节点,选中子节点当前的父节点 选了a,就要选中aaaaa
4 取消所有子节点,取消它们的父节点.... 取消了a,b,c 就要取消aaaaa希望有朋友帮我解决一下,感激不尽啊..................兄弟姐妹们 拜托啊......
□ a
□ b
□ c
□bbbbb
□ d
□ e
□ f
□ g
□ccccc
□ h
□ i
□ j我的TreeView里面的结构看上面.........
我现在想问:
1 选中父节点,选中它下面的所有子节点.........例: 选了aaaaa 就要选中a,b,c
2 取消父节点,取消它下面的所有子节点.....
3 选中一个子节点,选中子节点当前的父节点 选了a,就要选中aaaaa
4 取消所有子节点,取消它们的父节点.... 取消了a,b,c 就要取消aaaaa希望有朋友帮我解决一下,感激不尽啊..................兄弟姐妹们 拜托啊......
Private Sub selectnode(ByVal n As TreeNode, ByVal ck As Boolean)
If Not (n.Nodes.Count = 0) Then
n = n.LastNode
While Not (n Is Nothing)
n.Checked = ck
selectnode(n, ck)
n = n.PrevNode
End While
End If
End Sub
/// 全部节点check处理
/// </summary>
/// <param name="eTreeNode"></param>
private void CheckAll(TreeNode eTreeNode)
{
tvAllDepAndCam.AfterCheck -= new TreeViewEventHandler(tvAllDepAndCam_AfterCheck);
if (eTreeNode.Parent != null)
{
CheckParent(eTreeNode);
}
//if (eTreeNode.Nodes.Count > 0)
//{
// foreach (TreeNode mTN in eTreeNode.Nodes)
// {
// mTN.Checked = eTreeNode.Checked; // foreach (TreeNode mTNSub in mTN.Nodes)
// {
// mTNSub.Checked = mTN.Checked;
// CheckSub(mTNSub);
CheckSub(eTreeNode);
// }
// }
//} tvAllDepAndCam.AfterCheck += new TreeViewEventHandler(tvAllDepAndCam_AfterCheck);
}
/// <summary>
/// 父节点处理--我修改的
/// </summary>
/// <param name="eTreeNode"></param>
private void CheckParent(TreeNode eTreeNode)
{
if (eTreeNode.Parent == null)
{
return;
} // eTreeNode.Parent.Checked = eTreeNode.Checked;
int i = 1;
foreach (TreeNode mTN in eTreeNode.Parent.Nodes)
{
if (mTN.Checked!=true)
{
i = 0;
}
}
if (i == 1)
{
eTreeNode.Parent.Checked = true;
}
else
{
eTreeNode.Parent.Checked = false;
}
if (eTreeNode.Parent.Parent != null)
{
CheckParent(eTreeNode.Parent);
}
}
///// <summary>
///// 父节点处理 -- 网上代码
///// </summary>
///// <param name="eTreeNode"></param>
//private void CheckParent(TreeNode eTreeNode)
//{
// if (eTreeNode.Parent == null)
// {
// return;
// } // eTreeNode.Parent.Checked = eTreeNode.Checked; // foreach (TreeNode mTN in eTreeNode.Parent.Nodes)
// {
// eTreeNode.Parent.Checked = (eTreeNode.Parent.Checked || mTN.Checked);
// if (mTN.Parent != null)
// {
// CheckParent(mTN.Parent);
// }
// }
//}
/// <summary>
/// 子节点处理
/// </summary>
/// <param name="eTreeNode"></param>
private void CheckSub(TreeNode eTreeNode)
{
foreach (TreeNode mTN in eTreeNode.Nodes)
{
mTN.Checked = eTreeNode.Checked;
CheckSub(mTN);
}
}
几种处理的方式你可以自己修改着做
/// 如果该节点是叶子节点,就检查该叶子节点的父节点是否被选中,如果没有将父结点设为选中状态。
/// 如果该节点是父节点点,就检查该父节点点的父节点是否被选中,如果没有将父结点的父节点设为选中状态。
/// 如果是取消该叶子节点,则检测该叶子节点的所有兄弟结点是否全部没有被选中。如果是就取消该节点的父结点的选中状态
/// 如果点击的是父结点,则将该节点的所有字节点设置为该节点相同的状态
/// </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);
}
}
}
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Node.Nodes.Count > 0)
foreach (TreeNode tn in e.Node.Nodes)
tn.Checked = e.Node.Checked;
if (e.Node.Parent != null)
{
if (e.Node.Checked)
e.Node.Parent.Checked = true;
else
{
bool uncheck = true;
foreach (TreeNode tn in e.Node.Parent.Nodes)
{
if (tn.Checked)
{
uncheck = false;
break;
}
}
if (uncheck)
e.Node.Parent.Checked = false;
}
}
}
这个可以满足你所有要求了