StatusStripLabel动态更新

时间:2013-07-20 16:42:29

标签: c# visual-studio-2010

我的观点是在StatusStripLabel上显示所有子节点的数量。我的观点是,我希望每次更改子节点数时,StatusStripLabel都会更新 - 我将添加或删除一些已存在的节点。首先,我将代码放在Public Form中,但它没有像我预期的那样工作。过了一段时间,我想到了实际可行的想法:我把代码放在了button方法中。但在那之后,我意识到我需要将它放在第二位,以防删除节点。所以我的问题是:有什么能让它更简单吗?如果我的解释还不够,那就告诉我,我会尽我所能。

来自Public Form的代码(因为我希望该计数器能够从开始工作,而不是在我按下按钮之后)

childNodeCounter();
toolStripStatusLabel1.Text = "Number of games in database: " + NodeCounter.ToString();

方法:

        public void childNodeCounter()
    {
        NodeCounter = 0;
        foreach (TreeNode RootNode in treeView1.Nodes)
        {

            foreach (TreeNode ChildNode in RootNode.Nodes)
            {
                NodeCounter++;
            }
        }
        toolStripStatusLabel1.Text = "Number of games in database: " + NodeCounter.ToString();

    }

按钮内的代码方法:

    private void button1_Click(object sender, EventArgs e)
    {

        NodeCounter = 0;
        foreach (TreeNode RootNode in treeView1.Nodes)
        {

            foreach (TreeNode ChildNode in RootNode.Nodes)
            {
                NodeCounter++;
            }
        }
        toolStripStatusLabel1.Text = "Number of games in database: " + NodeCounter.ToString();
    }

编辑:感谢先生。 Hans Passant我写了这篇文章并且效果很好:

        public int childNodeCounter(TreeNodeCollection nodes)
        {
        int count = 0;
        foreach (TreeNode RootNode in nodes)
        {
            foreach (TreeNode ChildNode in RootNode.Nodes)
                count++;
        }
        return count;

事件处理程序如下所示:

toolStripStatusLabel1.Text = "Number of games in database: " + childNodeCounter(treeView1.Nodes);

3 个答案:

答案 0 :(得分:1)

三个小优化

  1. 而是自己迭代树,只需使用ChildNode.Nodes.GetNodeCount

  2. 不要在不同的地方重复相同的逻辑,让按钮Click事件只需调用UpdateNodeCount()方法即可。

  3. 第一个代码片段中的文本初始化程序是冗余的,可以删除:对childNodeCounter的调用已经进行状态标签更新。

答案 1 :(得分:1)

遍历树结构的自然方法是使用递归。这总是有点难以理解,但有很多资源可用。迭代地执行它是非常丑陋的,你必须使用Stack<>允许您再次从嵌套节点回溯。因此,我将发布递归解决方案:

    private static int CountNodes(TreeNodeCollection nodes) {
        int count = nodes.Count;
        foreach (TreeNode node in nodes) count += CountNodes(node.Nodes);
        return count;
    }

然后您的事件处理程序变为:

    private void button1_Click(object sender, EventArgs e) {
        toolStripStatusLabel1.Text = "Number of games in database: " +
            CountNodes(treeView1.Nodes);
    }

答案 2 :(得分:0)

如果要向treeView添加和删除“游戏”节点,则必须使用void AddGame(string title)void RemoveGame(string title)等方法添加/删除(子)节点 - 那些您想要的总数数数。如果我理解得很好,那么每次子节点数量发生变化时,都希望toolStripStatusLabel1.Text自动更新。在这种情况下,您可以添加字段

private int nodesCount;

到你的Form类,有类似的东西:

void AddGame(string title)
{
    if(InvokeRequired)
    {
        Invoke(new MethodInvoker(delegate() { AddGame(title); }));
    }
    else
    {
        AddGameNodeToTreeView(title); // add new game node to desired place in TreeView
        nodesCount++; // increase node counter
        toolStripStatusLabel1.Text = "Number of games in database: " + nodesCount;
    }  
}

RemoveGame()将以相同的方式实现(或与AddGame()一起使用另一个参数 - bool add加入单个方法。如果您要添加/删除多个节点,则可以扩展这两种方法,在这种情况下,您将传递标题数组并相应地更新nodesCount

这种方法的优点是,您不必在每次更新toolStripStatusLabel1.Text之前对树中的节点进行计数。此外,toolStripStatusLabel1.Text会自动更新,而不仅仅是在用户点击按钮时。

缺点是nodesCount有点冗余信息:感兴趣的节点总数在treeView中是“隐藏的”。您必须确保nodesCount与实际节点数同步。