2012-06-17 72 views
3

我在這裏是新手,幾乎在任何地方都爲我的問題尋找答案 - 無濟於事。我希望這裏有人能幫忙。帶有複選框的Winform TreeView - 只更新可見節點

我有一個WinForm應用程序,我使用TreeView在選定的根文件夾下顯示文件夾結構。樹視圖啓用了CheckBoxes。當我選中或取消選中TreeNode上的複選框時,TreeNode下方的任何可見節點都會發生更改 - 非常好。

問題是,當我進一步擴展節點時,則新的可見節點不是更新爲正確的狀態。

我用下面的遞歸程序來執行更新:

private void FileTreeView_AfterCheck(object sender, TreeViewCancelEventArgs e) 
    { 
     // The code only executes if the user caused the checked state to change. 
     if (e.Action == TreeViewAction.ByMouse) 
     { 
      if (e.Node.Nodes.Count > 0) 
      { 
       // Calls the CheckAllChildNodes method, passing in the current 
       // checked value of the TreeNode whose checked state changed. 
       CheckAllChildNodes(e.Node, e.Node.Checked); 
      } 
     } 
    } 

看來,遞歸函數只在乎是可見樹節點:

private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked) 
    { 
     foreach (TreeNode node in treeNode.Nodes) 
     { 
      node.Checked = nodeChecked; 
      if (node.Nodes.Count > 0) 
      { 
       // If the current node has child nodes, call the 
       // CheckAllChildNodes method recursively. 
       CheckAllChildNodes(node, nodeChecked); 
      } 
     } 
    } 

正是從這個事件處理函數調用在執行時。

如果任何人都可以給的什麼是錯的,什麼可以做,以糾正一個線索,我們將不勝感激。

在此先感謝。

最好的問候,

L.胡默爾

回答

-1

我試圖複製你可能會在代碼中做什麼,你可以請使用此代碼並確認它正在正常工作,或者您正面臨着同樣的問題。

private void PopulateFolderTreeView(string directories, TreeNode parentNode) 
      { 
       string[] directoriesArray = Directory.GetDirectories(directories); 
       string[] filesArrays = Directory.GetFiles(directories); 
       if (directoriesArray.Length != 0) 
       { 
        foreach (string currentDirectory in directoriesArray) 
        { 
         TreeNode myNode = new TreeNode(Path.GetFileNameWithoutExtension(currentDirectory)); 
         if (parentNode == null) 
         { 
          treeView1.Nodes.Add(myNode); 
         } 
         else 
         { 
          parentNode.Nodes.Add(myNode); 
         } 
         PopulateFolderTreeView(currentDirectory, myNode); 
        } 

       } 
       if (filesArrays.Length != 0) 
       { 
        foreach (string currentFile in filesArrays) 
        { 
         TreeNode myNode = new TreeNode(Path.GetFileName(currentFile)); 
         if (parentNode == null) 
         { 
          treeView1.Nodes.Add(myNode); 
         } 
         else 
         { 
          parentNode.Nodes.Add(myNode); 
         } 
         //PopulateTreeView(currentDirectory, myNode); 
        } 

       } 
      } 



    private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked) 
      { 
       foreach (TreeNode node in treeNode.Nodes) 
       { 
        node.Checked = nodeChecked; 
        if (node.Nodes.Count > 0) 
        { 
         // If the current node has child nodes, call the 
         // CheckAllChildNodes method recursively. 
         CheckAllChildNodes(node, nodeChecked); 
        } 
       } 
      } 

      private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) 
      { 
       // The code only executes if the user caused the checked state to change. 
       if (e.Action == TreeViewAction.ByMouse) 
       { 
        if (e.Node.Nodes.Count > 0) 
        { 
         // Calls the CheckAllChildNodes method, passing in the current 
         // checked value of the TreeNode whose checked state changed. 
         CheckAllChildNodes(e.Node, e.Node.Checked); 
        } 
       } 

      } 

,就把這行無論是在窗體的Load事件或按鈕的Click事件

PopulateFolderTreeView(@"C:\Program Files\", null); 
+0

我不認爲OP在填充treeview的時候有任何問題。 –

+0

你好, 謝謝你的建議。我試圖實現你所描述的方法,但是當我運行應用程序並嘗試執行行 我得到以下運行時錯誤: 出現「UnauthorizedAccessException是未處理」 「拒絕訪問路徑「C :\ Program Files \ Common Files \'被拒絕。「 我已經檢查了憑據,並且他們看起來確實無處不在。 –

+0

對不起,我所說的這一行是「string [] directoriesArray = Directory.GetDirectories(directories);」 –

1

如果您使用數據綁定那麼它很可能不是一個TreeView的問題,它與數據綁定的問題。它不更新不可見的控件。對於Winforms Tabcontrol問題,請參見MSDN thread

2

兩件事。一,你不需要「if(e.Node.Nodes.Count> 0)」。當你調用一個「foreach」時,這有點多餘,就好像有0個節點一樣,它立即通過循環。

兩個,最簡單的解決方案可能是剛絲入AfterExpand方法,當節點被擴大,設置兒童則:

private void FileTreeView_AfterExpandobject sender, TreeViewEventArgs e) 
{ 
    // Calls the CheckAllChildNodes method, passing in the current 
    // checked value of the TreeNode whose checked state changed. 
    CheckAllChildNodes(e.Node, e.Node.Checked);   
} 

另外,你確定你想在你的事件方法TreeViewCancelEventArgs ,而不只是TreeViewEventArgs?