0

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

代码来自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);
4

3 回答 3

1

三个微小的优化

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

  2. 与其在不同的地方重复相同的逻辑,不如让您的按钮单击事件简单地调用该UpdateNodeCount()方法。

  3. 第一个代码片段中的文本初始化器是多余的,可以删除:对 childNodeCounter 的调用已经完成了状态标签的更新。

于 2013-07-20T16:50:21.910 回答
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);
    }
于 2013-07-20T16:55:45.497 回答
0

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与实际节点数同步。

于 2013-07-20T18:12:55.890 回答