使用numericupdown展开/折叠treeView节点时。为什么倒塌部分不起作用?

时间:2015-02-12 17:03:47

标签: c# .net winforms treeview

我在form1设计器中有一个treeView。 treeView变量名称为:treeViewMS1

当我运行我的程序时,treeView会自动扩展到1级:

Expanded level 1

现在,如果我点击numericUpDown并将值更改为2,那么:

Expanded level 2

因此,当我将numericUpDown更改为1时,扩展部分工作正常,扩展后工作正常。

现在当它在第2级时,我将numericUpDown更改回值1而不是第1级,而是回到我的第一个屏幕截图扩展级别1,它回到根级别0.

并且我希望崩溃部分只能向后移动一个级别,但是如果我在扩展的级别2或3或5上它将永远跳到0到根。 p>

这是numericUpDown值已更改事件:

decimal oldValue;
        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            if (numericUpDown1.Value > oldValue)
            {
                ExpandToLevel(treeViewMS1.Nodes, (int)numericUpDown1.Value);
            }
            else
            {               
                CollapseToLevel(treeViewMS1.Nodes, (int)numericUpDown1.Value);
            }
            oldValue = numericUpDown1.Value;          
        }

这是ExpandToLevel方法:

void ExpandToLevel(TreeNodeCollection nodes, int level)
        {
            if (level > 0)
            {
                foreach (TreeNode node in nodes)
                {
                    node.Expand();
                    ExpandToLevel(node.Nodes, level -1);
                }
            }
        }

和CollapseToLevel方法:

void CollapseToLevel(TreeNodeCollection nodes, int level)
        {
            if (level > 0)
            {
                foreach (TreeNode node in nodes)
                {
                    node.Collapse();
                    CollapseToLevel(node.Nodes, level - 1);
                }
            }
        }

如果我处于扩展级别2并且仅将numericUpDown值移动1而不是只折叠一个级别,它会跳转并将其折叠到根目录:

Collapsed

您可以看到numericUpdown值为1,我将其从2移回。 但是treeView位于根节点而不是1级。

我尝试使用常规按钮单击事件添加了一个按钮并调用了CollapseToLevel但结果相同。我想也许numericUpDown存在问题,但扩展工作正常,只有崩溃才能正常工作。

2 个答案:

答案 0 :(得分:1)

TreeView.Nodes集合是TreeView中的每个节点。在CollapseToLevel()代码中,您将折叠每个节点,而不检查某个深度或当前节点路径的指示符。因此,当您完成后,您将折叠所有节点,这正是您的图像所描绘的。您需要在此处添加代码以在折叠之前评估节点的深度。

答案 1 :(得分:0)

我这样解决了: 在Form1_Load事件中,我做了:

SetToLevel(treeViewMS1.Nodes, 1);

在我的情况下,我希望它在第1级默认开始。

然后在numericupdown1更改值事件:

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            SetToLevel(treeViewMS1.Nodes, (int)numericUpDown1.Value);
        }

然后方法SetToLevel:

void SetToLevel(TreeNodeCollection nodes, int level)
        {
            foreach (TreeNode node in nodes)
            {
                node.Collapse(false);
            }            
            ExpandToLevel(nodes, level);
        }

最后一个方法是EXpandToLevel:

void ExpandToLevel(TreeNodeCollection nodes, int level)
        {
            if (level > 0)
            {
                foreach (TreeNode node in nodes)
                {
                    node.Expand();
                    ExpandToLevel(node.Nodes, level -1);
                }
            }
        }

现在它的工作完美,就像我希望它能够工作一样。 更改numericupdown值时,它会更改节点树的展开/折叠级别。