2012-08-17 98 views
1

我有一個linq對象,我試圖用c#winforms填充treeview。c#從LINQ對象填充treeview

樣品

Column 1 Column 2 Column 3   
Test 1  Item A  Sub Item 1  
Test 1  Item A  Sub Item 2  
Test 1  Item A  Sub Item 3  
Test 1  Item B  Sub Item 1  
Test 1  Item B  Sub Item 2  
Test 1  Item B  Sub Item 3 

,並填補了樹形像

Test 1 (CheckBox) 
------Item A (CheckBox) 
-------------Sub Item 1 (CheckBox) 
-------------Sub Item 2 (CheckBox) 
-------------Sub Item 3 (CheckBox) 
------Item B (CheckBox) 
-------------Sub Item 1 (CheckBox) 
-------------Sub Item 2 (CheckBox) 
-------------Sub Item 3 (CheckBox) 

什麼是實現這一目標的最簡單的方法?

感謝 SP

+0

我看到很多似乎被格式化爲DOS的文本。你可以請張貼一些C#(你說你寫的LINQ)。你有沒有嘗試過WinForms的TreeView控件? – 2012-08-17 13:43:06

+0

我正在使用WinForms控件,但無法讓對象正確顯示 – Steven 2012-08-17 13:46:44

+0

更好的設計爲使用ID,ParentID,Name字段以及使用遞歸來填充樹視圖。示例[這裏](http://stackoverflow.com/questions/3184115/how-to-populate-treeview?rq=1),[這裏](http://stackoverflow.com/questions/10814466/how-to- dynamic-populate-treeview-c?lq = 1)等等。 – Reniuz 2012-08-17 13:47:32

回答

1

好吧,如果你執行下面的查詢:

var query = data.GroupBy(item => item.Column1) 
       .Select(group => group.GroupBy(item => item.Column2)) 
       .Select(group => group.Select(innerGroup => 
        innerGroup.GroupBy(item => item.Column3))); 

你將不得不全部由列1,然後2和3的第一分組的項目,所以它已經在樹上結構體。現在你只需要有3個嵌套for循環來添加項目到樹形視圖。

foreach (var outermostGroup in query) 
{ 
    //add node for outermostGroup's key 
    foreach (var middleGroup in outermostGroup) 
    { 
     //add child node of the above node for middleGroup key 
     foreach (var innerGroup in middleGroup) 
     { 
      //add child node of the above node for innerGroup key 
     } 
    } 
} 

顯然,這種代碼,如果有一個固定的(最大)深度列固定數量的纔有效。如果你不知道列的數量並且可以有任意的深度,那麼你需要一個完全不同的方法。