选中父节点时自动检查子节点
本文关键字:检查 子节点 父节点 | 更新日期: 2023-09-27 18:29:00
>我在VS 2012中使用.net c#,并尝试编写一个函数,该函数将自动检查已检查的父树视图节点的所有子节点。我是 c# 编程的新手,所以我找到了以下代码,但它有两个问题:
- 如果(HasChildNodes(node((Visual Studio报告HasChildNodes,则未知。
- 我想从选定的节点开始,我单击检查,我认为代码遍历了整个树?
感谢您的任何帮助。
treeView.BeginUpdate();
//Loop through all the nodes of tree
foreach (TreeNode node in treeView.Nodes)
{
//If node has child nodes
if (HasChildNodes(node))
{
if (node.Checked == true)
{
//Check all the child nodes.
foreach (TreeNode childNode in node.Nodes)
{
childNode.Checked = true;
}
}
}
}
treeView.EndUpdate();
下面是
检查和取消选中子节点和父节点的树视图示例的工作代码(添加树视图并将名称分配为 tvwDynamic(
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
命名空间树视图{ 公共分部类 表格 1 : 表格 { 公共表单1(( { 初始化组件((; }
private void Form1_Load(object sender, EventArgs e)
{
TreeNode MainNode = new TreeNode("Java");
tvwDynamic.Nodes.Add(MainNode);
MainNode = new TreeNode("PHP");
tvwDynamic.Nodes.Add(MainNode);
TreeNode node2 = new TreeNode("C#");
TreeNode node3 = new TreeNode("VB.NET");
TreeNode[] childNodes = new TreeNode[] {node2,node3};
MainNode = new TreeNode("ASP.NET", childNodes);
tvwDynamic.Nodes.Add(MainNode);
TreeNode node4 = new TreeNode("Winforms");
TreeNode node5 = new TreeNode("Webforms");
TreeNode[] SubchildNodes = new TreeNode[] {node4,node5};
MainNode = new TreeNode("Test",SubchildNodes);
tvwDynamic.Nodes[2].Nodes[1].Nodes.Add(MainNode);
tvwDynamic.CheckBoxes = true;
}
private void tvwDynamic_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Action != TreeViewAction.Unknown)
{
if (e.Node.Nodes.Count > 0)
{
/* Calls the CheckAllChildNodes method, passing in the current
Checked value of the TreeNode whose checked state changed. */
this.CheckAllChildNodes(e.Node, e.Node.Checked);
}
}
SelectParents(e.Node, e.Node.Checked);
}
private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
{
foreach (TreeNode node in treeNode.Nodes)
{
node.Checked = nodeChecked;
if (node.Nodes.Count > 0)
{
// If the current node has child nodes, call the CheckAllChildsNodes method recursively.
this.CheckAllChildNodes(node, nodeChecked);
}
}
}
private void SelectParents(TreeNode node, Boolean isChecked)
{
var parent = node.Parent;
if (parent == null)
return;
if (!isChecked && HasCheckedNode(parent))
return;
parent.Checked = isChecked;
SelectParents(parent, isChecked);
}
private bool HasCheckedNode(TreeNode node)
{
return node.Nodes.Cast<TreeNode>().Any(n => n.Checked);
}
} }
treeview1.BeginUpdate();
foreach (TreeNode tn in e.Node.Nodes)
tn.Checked = e.Node.Checked;
treeview1.EndUpdate();
你必须在 AfterCheck EventHandler 中添加此代码。
下面是可以在Visual Studio的设计器中使用的简单控件:
public class BetterTreeView : TreeView
{
/// <summary>
/// Whether to apply Checked property changes to child nodes.
/// </summary
public bool TickChildNodes { get; set; }
protected override void OnAfterCheck(TreeViewEventArgs e)
{
base.OnAfterCheck(e);
if (TickChildNodes)
{
foreach (TreeNode node in e.Node.Nodes)
{
node.Checked = e.Node.Checked; // Triggers OnAfterCheck (recursive)
}
}
}
}
没有任何
与TreeView
相关的HasChildNodes
方法,你在这里混淆了XML
东西。
public void CheckNodes(TreeNode startNode){
startNode.Checked = true;
foreach(TreeNode node in startNode.Nodes)
CheckNodes(node);
}
//then you can call the method above with the TreeNode you check
CheckNodes(yourNode);
检查您是否有子节点就足够
了node.FirstNode != null
至于你的第二个问题,看起来你的代码检查了洞树,而不仅仅是从给定的节点,然后我需要再次查看整个方法签名以及你在哪里保存按下的节点。 如果您在像 myMember
这样的成员中有它,则使用 myMember
更改该方法中的treeView
:
treeView.BeginUpdate();
//Loop through all the nodes of tree
foreach (TreeNode node in myMember.Nodes)
{
//If node has child nodes
if (node.FirstNode != null)
{
if (node.Checked == true)
{
//Check all the child nodes.
foreach (TreeNode childNode in node.Nodes)
{
childNode.Checked = true;
}
}
}
}
treeView.EndUpdate();
更正foreach
循环:
foreach (TreeNode node in treeView1.Nodes)
{
//If node has child nodes
if (node.Checked == true) //it is better to first check if it is "checked" then proceed to count child nodes
{
if (node.GetNodeCount(false) > 0) //check if node has any child nodes
{
//Check all the child nodes.
foreach (TreeNode childNode in node.Nodes)
{
childNode.Checked = true;
}
}
}
}
检查参数节点是否检查。
然后遍历所有子节点。
if(e.Node.Checked==true)
{
foreach (TreeNode tn in e.Node.ChildNodes)
{
tn.Checked = true;
}
}