2014-02-21 191 views
0

我想填充任務和子任務的樹視圖,那些子任務充當該特定任務的子節點。填充樹視圖

我收到一條錯誤,說行上評論顯示錯誤,我是這樣做的全部錯誤還是錯過了一些愚蠢的東西?

「類型的未處理的異常 'System.ArgumentOutOfRangeException' 發生在System.Windows.Forms.dll中」

private void updateTreeView() 
     { 

      //Clear before entry 
      treeActiveTasks.Nodes.Clear(); 

      treeActiveTasks.BeginUpdate();  

      int parentCount = 0; 

      //Update tasks 
      foreach (Task task in m_user.Tasks) 
      { 
       if (!task.IsComplete) 
       { 
        treeActiveTasks.Nodes[parentCount].Nodes.Add(task.Title); //Error showing on this line 

        int i = 0; 
        foreach (Subtask subtask in task.Subtasks) 
        { 
         if (!subtask.IsComplete) 
         { 
          treeActiveTasks.Nodes[0].Nodes[0].Nodes.Add(subtask.Title); 
         }      

         i++; 
        } 
        parentCount++; 
       }    
      } 


      treeActiveTasks.EndUpdate(); 
     } 

回答

1

首次treeActiveTasks.Nodes[parentCount]進行評價時,該Nodes集合爲空(你已經明確清除了上面幾行),所以當你通過索引0(值爲parentCount)時,你會得到一個ArgumentOutOfRangeException

我想你想是這樣的:

private void updateTreeView() 
{ 
    treeActiveTasks.BeginUpdate();  
    treeActiveTasks.Nodes.Clear(); 
    foreach (var task in m_user.Tasks) 
    { 
     if (!task.IsComplete) 
     { 
      var taskNode = treeActiveTasks.Nodes.Add(task.Title); 
      foreach (var subtask in task.Subtasks) 
       if (!subtask.IsComplete) 
        taskNode.Nodes.Add(subtask.Title); 
     }    
    } 
    treeActiveTasks.EndUpdate(); 
} 

或者使用LINQ:

private void updateTreeView() 
{ 
    treeActiveTasks.BeginUpdate();  
    treeActiveTasks.Nodes.Clear(); 
    treeActiveTasks.Nodes.AddRange(
     (from task in m_user.Tasks 
     where !task.IsComplete 
     select new TreeNode(
      task.Title, 
      (from subtask in task.Subtasks 
       where !subtask.IsComplete 
       select new TreeNode(subtask.Title) 
      ).ToArray()) 
     ).ToArray()); 
    treeActiveTasks.EndUpdate(); 
} 
+0

我真的很喜歡那個LINQ版本,我以前沒有用過它,但它看起來很整齊。你通常用LINQ做什麼其他的事情? – Wizard

+0

如果'TreeNode'構造函數接受'IEnumerable '而不是'TreeNode []',它會更整齊。如果是這種情況,則不需要'ToArray'調用或者限定'from ... select'部分的括號。至於爲什麼要使用LINQ:各種各樣的東西! :) –

0

我摸索出了什麼問題,我添加子節點的父母,我沒有但仍然產生,因此是例外。代碼如下:

//Clear before entry 
    treeActiveTasks.Nodes.Clear(); 

    treeActiveTasks.BeginUpdate(); 




    int parentCount = 0; 

    //Update tasks 
    foreach (Task task in m_user.Tasks) 
    { 
     if (!task.IsComplete) 
     { 
      treeActiveTasks.Nodes.Add(task.Title); 


      foreach (Subtask subtask in task.Subtasks) 
      { 
       if (!subtask.IsComplete) 
       { 
        treeActiveTasks.Nodes[parentCount].Nodes.Add(subtask.Title); 
       } 

      } 
      parentCount++; 
     } 
    } 


    treeActiveTasks.EndUpdate(); 
+0

請看我的答案。有一種更簡單的方法可以在不使用額外變量'parentCount'的情況下執行此操作(並且在此處顯示的代碼中完全不使用'i')。 –