我在我的表单中启用了复选框。我需要添加任何检查到列表,所以我可以写出列表。如果我检查任何父节点(或最高级别的节点),它包括它们。如果我选择任何父节点,它也会选择其子节点(这是故意的),并显示这些节点。但是,如果我只检查任何子节点,它不会将它们添加到我的列表中。为什么没有选择父节点时我的子节点没有被检测到?
//check to see if there are any nodes checked
bool nodeHasCheck = false;
foreach (TreeNode n in nodes)
{
if (n.Checked)
{
nodeHasCheck = true;
break;
}
GetExtendedFeatures(n.Nodes);
}
//only return stuff if something's checked
if (nodeHasCheck == true)
{
foreach (TreeNode n in nodes)
{
if (n.Checked)
{
//n.BackColor = Color.Black;
nodeList.Add(n.Text);
}
GetExtendedFeatures(n.Nodes);
}
它还看来,如果我选择2个父节点,发生(认为这是正确的术语)的递归导致它找到第一个检查点,然后重新开始,并补充说,同样的检查节点第二次击中第二组节点之前。
我提供了我的节点测试,希望它足以确定为什么它没有检测到未选择父节点时选择的子节点。
更新 - 13年3月18日 我按一下按钮代码:
private void btnGenerate_Click(object sender, EventArgs e)
{
ScanNodes(treeView1.Nodes[0]);
}
private void ScanNodes(TreeNode parent)
{
foreach (TreeNode node in parent.Nodes)
{
if (node.Checked)
{
nodeList.Add(node.Text.ToString());
}
if (node.Nodes.Count > 0)
{
ScanNodes(node);
}
}
var message = string.Join(Environment.NewLine, nodeList);
message = message.Replace(Environment.NewLine, ", ");
MessageBox.Show(message);
nodeList.Clear();
}
我没有看到递归这里,除非GetExtendedFeatures其实是你展示方法的代码。对于您当前的代码,它只能通过检查父母的子节点循环。你必须遍历所有节点,看看它们是否被选中,然后添加到列表中。 – echavez 2013-03-03 20:13:34