C# 如何在选择或取消选择父节点时自动选择或取消选择所有子节点?
我的Windows窗体应用程序中有一个带有复选框的树状视图控件。如何在选择或取消选择父节点时自动选择或取消选择所有子节点?如果我没有弄错,事件文档中的示例代码完全符合您的要求。使用treeview的AfterCheck事件编码treeview中的子节点应发生的情况C# 如何在选择或取消选择父节点时自动选择或取消选择所有子节点?,c#,winforms,C#,Winforms,我的Windows窗体应用程序中有一个带有复选框的树状视图控件。如何在选择或取消选择父节点时自动选择或取消选择所有子节点?如果我没有弄错,事件文档中的示例代码完全符合您的要求。使用treeview的AfterCheck事件编码treeview中的子节点应发生的情况 private void HandleOnTreeViewAfterCheck(Object sender, TreeViewEventArgs e) { CheckTreeViewNod
private void HandleOnTreeViewAfterCheck(Object sender,
TreeViewEventArgs e)
{
CheckTreeViewNode(e.Node, e.Node.Checked);
}
private void CheckTreeViewNode(TreeNode node, Boolean isChecked)
{
foreach (TreeNode item in node.Nodes)
{
item.Checked = isChecked;
if (item.Nodes.Count > 0)
{
this.CheckTreeViewNode(item, isChecked);
}
}
}
将树状视图节点的相同状态也传递给其子节点,并将其选中属性设置为树状视图节点的相同状态。请尝试此代码,此代码用于检查父节点,并在单击子节点时取消选中父节点
If Not TreeView1.Nodes(e.Node.Text) Is Nothing Then
For Each node As TreeNode In TreeView1.Nodes(e.Node.Text).Nodes
If node.Parent.Checked = True Then
node.Checked = True
End If
If node.Parent.Checked = False Then
node.Checked = False
End If
Next
End If
private void CheckTreeViewNode(TreeNode node, Boolean isChecked)
{
foreach (TreeNode item in node.Nodes)
{
item.Checked = isChecked;
if (item.Nodes.Count > 0)
{
this.CheckTreeViewNode(item, isChecked);
}
}
if (isChecked && node.Parent != null)
{
treeView1.AfterCheck -= HandleOnTreeViewAfterCheck;
node.Parent.Checked = true;
treeView1.AfterCheck += HandleOnTreeViewAfterCheck;
}
if (!isChecked && node.Parent != null)
{
bool unchk = true;
treeView1.AfterCheck -= HandleOnTreeViewAfterCheck;
foreach (TreeNode item in node.Parent.Nodes)
{
if (item.Checked)
{
unchk = false;
break;
}
}
if (unchk)
node.Parent.Checked = false;
treeView1.AfterCheck += HandleOnTreeViewAfterCheck;
}
}
请在下面找到工作代码。我在我的应用程序中使用这个。希望这能解决问题
private void tree_Documents_AfterCheck(object sender, TreeViewEventArgs e)
{
TreeNode checkedNode = e.Node;
foreach (TreeNode node in checkedNode.Nodes)
{
node.Checked = checkedNode.Checked;
}
}
这个简单的代码适合我
private void treeView_AfterCheck(object sender, TreeViewEventArgs e) {
try {
e.Node.TreeView.BeginUpdate();
if (e.Node.Nodes.Count > 0) {
var parentNode = e.Node;
var nodes = e.Node.Nodes;
CheckedOrUnCheckedNodes(parentNode, nodes);
}
} finally {
e.Node.TreeView.EndUpdate();
}
}
private void CheckedOrUnCheckedNodes(TreeNode parentNode, TreeNodeCollection nodes) {
if (nodes.Count > 0) {
foreach (TreeNode node in nodes) {
node.Checked = parentNode.Checked;
CheckedOrUnCheckedNodes(parentNode, node.Nodes);
}
}
}
您可以创建一个方法并从treeviewbeforecheck事件调用它,这样它将检查所有树节点。上面的帖子帮助您或您卡住了somewhere@TechGiant:如何创建treeviewbeforecheck事件?foreach循环是否递归地遍历树?e.Node.Nodes在分支上行走吗?不,只有一层。假设他的req只有一个级别。我添加了执行递归检查的代码。感谢您指出这一点。@VijaySirigiri此逻辑有点冒险,因为当您检查foreach中的子项时,也会触发他的AfterCheck事件,因此级联效果变得不可预测。我建议改进上述代码,在调用CheckTreeViewNode方法:ife.Action!之前执行此检查如何在c.net中创建AfterCheck事件?只需右键单击表单中的树视图,转到属性。在该对话框中,选择事件选项卡。您将在此处找到与此控件关联的事件列表。双击AfterCheck事件,它会为您生成。@Sourav,您的意思是,因为我没有复制文档中的代码?它可以在我提供的链接中找到。也就是说,你是对的,我可能不应该回答这个问题,但因为缺乏研究,我投票决定结束这个问题。2011年我还在学习诀窍……请在代码中添加一些注释并解释!这不会选中/取消选中checkedNode的子节点。
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Node.Nodes.Count != 0)
{
if (e.Node.Checked)
{
CheckAllChildNodes1(e.Node);
}
else
{
UncheckChildNodes1(e.Node);
}
}
}
private void CheckAllChildNodes1(TreeNode treeNodeAdv)
{
foreach (TreeNode nd in treeNodeAdv.Nodes)
{
nd.Checked = treeNodeAdv.Checked;
}
}
private void UncheckChildNodes1(TreeNode treeNodeAdv)
{
foreach (TreeNode nd in treeNodeAdv.Nodes)
{
nd.Checked = treeNodeAdv.Checked;
}
}
private void treeView_AfterCheck(object sender, TreeViewEventArgs e) {
try {
e.Node.TreeView.BeginUpdate();
if (e.Node.Nodes.Count > 0) {
var parentNode = e.Node;
var nodes = e.Node.Nodes;
CheckedOrUnCheckedNodes(parentNode, nodes);
}
} finally {
e.Node.TreeView.EndUpdate();
}
}
private void CheckedOrUnCheckedNodes(TreeNode parentNode, TreeNodeCollection nodes) {
if (nodes.Count > 0) {
foreach (TreeNode node in nodes) {
node.Checked = parentNode.Checked;
CheckedOrUnCheckedNodes(parentNode, node.Nodes);
}
}
}
private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
{
foreach (TreeNode node in treeNode.Nodes)
{
node.Checked = nodeChecked;
if (node.Nodes.Count > 0)
{
this.CheckAllChildNodes(node, nodeChecked);
}
}
}
private void treeView_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action != TreeViewAction.Unknown)
{
if (e.Node.Nodes.Count > 0)
{
if (!e.Node.Checked)
{
this.CheckAllChildNodes(e.Node, e.Node.Checked);
}
}
}
if (e.Node.Parent != null)
{
TreeNode n = e.Node;
while (n.Parent != null)
{
if (n.Checked)
{
n.Parent.Checked = true;
}
n = n.Parent;
}
}
}