我有一个程序,它有一个包含节点的TreeView列表,以及带有子节点的节点。这些都启用了checkbox属性。我需要知道如何检查哪些节点/子节点被检查。到目前为止,我已经能够成功地测试父节点,但没有子节点使用:
//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;
}
}如何让它检查父节点以及子节点?我已经找过了,但没有找到任何能帮我澄清这件事的东西。
发布于 2013-01-26 06:09:27
您可以定义一个递归函数来标记所有选定的项:
private static void MarkSelectedNodes(TreeNodeCollection nodes)
{
foreach (TreeNode n in nodes)
{
if (n.Checked)
n.BackColor = Color.Black;
MarkSelectedNodes(n.Nodes);
}
}并这样称呼它:
MarkSelectedNodes(treeView1.Nodes);发布于 2013-01-26 06:21:34
您还可以“展开”递归以提高性能并避免堆栈溢出:
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);
}
}发布于 2013-01-26 06:08:53
您需要在子节点中再下拉一层。同样的代码,只是另一个循环:
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;
}
}https://stackoverflow.com/questions/14531041
复制相似问题