我有一个程序,其中包含一个包含节点的TreeView列表和包含子节点的节点。这些都具有checkbox属性enable。我需要知道如何检查哪些节点/节点子节点被检查。到目前为止,我已经能够成功测试父节点,但没有孩子使用:
//this will turn black any node that is checked, doesn't affect the children though
TreeNodeCollection nodes = this.treeView1.Nodes;
foreach (TreeNode n in nodes)
{
if (n.Checked)
{
n.BackColor = Color.Black;
}
}
如何检查父节点以及子节点?我已经搜索过,但没有找到任何可以解决这个问题的方法。
答案 0 :(得分:4)
您可以定义一个标记所有选定项目的递归函数:
private static void MarkSelectedNodes(TreeNodeCollection nodes)
{
foreach (TreeNode n in nodes)
{
if (n.Checked)
n.BackColor = Color.Black;
MarkSelectedNodes(n.Nodes);
}
}
并称之为:
MarkSelectedNodes(treeView1.Nodes);
答案 1 :(得分:1)
您还可以“展开”递归以提高性能并避免堆栈溢出:
private static void MarkSelectedNodes(TreeNodeCollection nodes)
{
Stack<TreeNode> toProcess =
new Stack<TreeNode>(nodes.OfType<TreeNode>());
while (toProcess.Count != 0)
{
TreeNode node = toProcess.Pop();
if (node.Checked)
node.BackColor = Color.Black;
foreach (TreeNode child in node.Nodes)
toProcess.Push(child);
}
}
答案 2 :(得分:0)
您需要将另一个级别下拉到子节点中。相同的代码,只是另一个循环:
TreeNodeCollection nodes = this.treeView1.Nodes;
foreach (TreeNode n in nodes)
{
foreach (TreeNode c in n.Nodes)
{
if (c.Checked)
{
c.BackColor = Color.Gray;
}
}
if (n.Checked)
{
n.BackColor = Color.Black;
}
}
答案 3 :(得分:0)
public static IEnumerable<TreeNode>
GetAllCheckedChildNodes(TreeNode node)
{
foreach (TreeNode tmpNode in node.Nodes)
{
if (tmpNode.Checked)
{
yield return tmpNode;
}
foreach (var x in GetAllCheckedChildNodes(tmpNode))
{
yield return x;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
var checkedNodes = GetAllheckedChildNodes(MyRootNode);
foreach (TreeNode checkedNode in checkedNodes)
{
checkedNode.BackColor = Color.Black;
}
}