StatusStripLabel动态更新
本文关键字:更新 动态 StatusStripLabel | 更新日期: 2023-09-27 18:24:14
我的重点是在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);
三个微小的优化
-
与其自己迭代树,不如使用
ChildNode.Nodes.GetNodeCount
-
与其在不同的地方重复相同的逻辑,不如让按钮单击事件简单地调用
UpdateNodeCount()
方法。 -
第一个代码片段中的文本初始值设定项是多余的,可以删除:对childNodeCounter的调用已经进行了状态标签更新。
遍历树结构的自然方法是使用递归。这总是有点难以推理,但有很多可用的资源。迭代执行要丑陋得多,必须使用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);
}
如果要在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
)。如果添加/删除多个节点,那么这两种方法都可以扩展,在这种情况下,您将传递title数组并相应地更新nodesCount
。
这种方法的优点是,在更新toolStripStatusLabel1.Text
之前,不必每次都对树中的节点进行计数。此外,toolStripStatusLabel1.Text
不仅在用户单击按钮时自动更新。
缺点是nodesCount
在某种程度上是冗余信息:感兴趣的节点总数在treeView
中被"隐藏"。您必须确保nodesCount
与实际节点数同步。