2013-07-20 74 views
0

我的觀點是在StatusStripLabel中顯示所有子節點的數量。我的觀點是,我希望StatusStripLabel每次更新時都會更新一些子節點 - 我將添加或刪除一些已存在的節點。首先,我將代碼放在Public Form中,但它沒有像我期望的那樣工作。過了一段時間後,我想到了一個真正有效的方法:我將代碼放在了按鈕方法中。但之後,我意識到我需要將它放在第二位,以防刪除節點。所以我的問題是:有什麼可以使它更簡單嗎?如果我的解釋不夠,告訴我,我會盡我所能。StatusStripLabel動態更新

Public Form代碼(因爲我想該計數器從beggining工作,而不是之後我就按下按鈕)

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(); 
    } 

編輯:謝謝先生。漢斯帕桑特我寫了這一點,它工作得很好:

 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); 

回答

1

三個微小的優化

  1. 寧可自己遍歷樹,只是使用ChildNode.Nodes.GetNodeCount

  2. 而不是重複相同的邏輯不同的地方,有你的按鈕點擊事件只需要調用UpdateNodeCount()方法。

  3. 第一個代碼片段中的文本初始值設定項是多餘的,可以省略:對childNodeCounter的調用已經完成狀態標籤更新。

+0

1.「ChildNode.Nodes.GetNodeCount」僅適用於XML,我認爲。 2.我以前有過,但不能像我想的那樣工作,但現在已經修好了。 3.我不保存這個號碼的任何地方,所以每次程序啓動時,都必須重新計算。 – PotatoBox

+1

1. WinForms TreeNode有GetNodeCount()方法。 2.消除冗餘可能不會加速您的程序,但使其更易於理解和維護。 3.我認爲你不明白:當你調用childNodeCounter()時,它會更新狀態標籤。您不必立即更新狀態標籤。 – Curt

+0

1.現在我明白了,你是對的。它看起來有點用處,我將來會實施它。我對此很清楚。我以前沒有解釋清楚 - 在你的評論之後,我把它變成了方法。再次,現在我明白了。感謝您的反饋,當我創建此問題時,我想看到的那種類型的評論。 – PotatoBox

1

自然的方式遍歷樹結構是通過使用遞歸。這總是有點難以理解,但有很多可用的資源。迭代地進行迭代是非常醜陋的,您必須使用堆棧<>以允許您再次退出嵌套節點。因此,我會發布的遞歸解決方案:

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); 
    } 
+0

謝謝,這很有道理。但是你的代碼統計了子節點和根節點,我的目標是隻讓子節點數。 – PotatoBox

+0

「子節點」並不意味着太多,你可能正在談論葉節點。請不要猶豫,根據您的需要調整代碼。 –

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中感興趣的節點總數是'hidden'。您必須確保nodesCount與實際的節點數同步。