使用foreach语句并切换为已检查的多个节点

时间:2015-03-04 07:07:58

标签: c# winforms foreach switch-statement nodes

我在TreeView列表中处理节点,子节点,子节点;更不用说,复选框。我的目标是选择/检查多个节点,并且只需单击一个按钮即可执行链接到独占代码的每个节点。我已经考虑过使用带有switch和if语句的foreach语句。 Foreach 循环遍历树视图的节点, if 检查节点是否已选中,切换以浏览匹配的案例值已检查的节点。这是我的想法,但我觉得那里有一个更好的想法。有人可以验证下面的程序或提供更简单,更清洁的版本吗?

我的想法:这样做:

foreach (TreeNode rootNodes in treeView1.Nodes)
{
    foreach (TreeNode childNodes in rootNodes.Nodes)
    {
        if (childNodes.Checked == true)
        {
            switch (childNodes.Name.ToString())
            {
                case "Trial A":
                    //execute code for Trial A
                    MessageBox.Show("A"); //trial
                    break;
                case "Trial B":
                    //execute code for Trial B
                    MessageBox.Show("B"); //trial
                    break;
                case "Trial C":
                    //execute code for Trial C
                    MessageBox.Show("C"); //trial
                    break;
                default:
                    MessageBox.Show("error");
                    break;
            }
        }
    }
}

到目前为止,当我尝试这个时,它起作用了。当我选择多个节点时,每个节点的代码一次运行一个。实际上,让我有点喜出望外。问题在于我,有这种唠叨的感觉,这个程序可能是不正确的,或者我将来可能会遇到问题。

我正在使用VS 2005,.NET 2.0在WinForms上工作。 旁注:我将xml文件解析为树视图列表。节点对应于xml文件中的对象。

另一个旁注:我还在学习。我是新手。绝对是C#新手。至于其他编程经验,我知道一些C和C ++(但只是基础知识,仅适用于学校的一些练习和项目)。

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您可以拥有未定义的分层深度节点。在这种情况下,您需要执行递归:

foreach (TreeNode node in treeView1.Nodes) RecurseTree(node);

private void RecurseTree(TreeNode node)
{
    if (node.Checked == true)
    {
        switch (node.Name)
        {
            case "Trial A":
                //execute code for Trial A
                MessageBox.Show("A"); //trial
                break;
            case "Trial B":
                //execute code for Trial B
                MessageBox.Show("B"); //trial
                break;
            case "Trial C":
                //execute code for Trial C
                MessageBox.Show("C"); //trial
                break;
            default:
                MessageBox.Show("error");
                break;
        }
    }

    foreach (TreeNode childNode in node.Nodes) RecurseTree(childNode);
}