2013-05-03 27 views
3

我遇到了從我的對象列表填充我的樹形視圖的問題。我一直在谷歌尋找解決方案,我發現一些話題接近我的問題,但他們都沒有解決它。如何從對象列表中填充樹形圖

我有一個列表與每個對象的屬性:名稱和組。

我想填充我樹狀象下面這樣:

+---Group 1 
| | 
| +--------object.Name <-- 
| +--------object.Name <-- all objects with object.Group = Group 1 
| +--------object.Name <-- 
| 
+---Group 2 
| | 
| +--------object.Name <-- 
| +--------object.Name <-- all objects with object.Group = Group 2 
| +--------object.Name <-- 
| 

等。

謝謝。

+0

請放開你的代碼生成的對象名單,然後我處理'treeview'報表你:) – saeed 2013-05-04 07:55:25

回答

2

工作非常出色,謝謝。我剛剛在else的開頭和結尾添加了幾行,如下所示。

private void PopulateTreeView() 
    { 
     ListOfObjectsSorted = ListOfObjects.OrderBy(r => r.Group).ToList(); 
     var topNode = new TreeNode("Select all"); 
     treeView1.Nodes.Add(topNode); 
     string currentGroup = ListOfObjectsSorted.First().Group; 
     var treeNodes = new List<TreeNode>(); 
     var childNodes = new List<TreeNode>(); 
     foreach (Object obj in ListOfObjectsSorted) 
     { 
      if (currentGroup == rule.Group) 
       childNodes.Add(new TreeNode(obj.Name)); 
      else 
      { 
       if (childNodes.Count > 0) 
       { 
        treeNodes.Add(new TreeNode(currentGroup, childNodes.ToArray())); 
        childNodes = new List<TreeNode>(); 
       } 
       childNodes.Add(new TreeNode(obj.Name)); 
       currentGroup = obj.Group; 
      } 
     } 
     if (childNodes.Count > 0) 
     { 
      treeNodes.Add(new TreeNode(currentGroup, childNodes.ToArray())); 
     } 
     treeView1.Nodes[0].Nodes.AddRange(treeNodes.ToArray()); 
    } 
1

是你的技術問題,還是隻是如何處理它?您可以按object.Group排序,然後在每次組更改時創建頂級節點。

編輯: 這裏有以下一些示例代碼,我沒有測試它,更把它作爲一個準則:

string currentGroup = null; 
List<TreeNode> treeNodes = new List<TreeNode>(); 
List<TreeNode> childNodes = new List<TreeNode>(); 
foreach (BusinessObject obj in objectList) 
{ 
    if (currentGroup == obj.Group) 
     childNodes.Add(new TreeNode(obj.Name)); 
    else 
    { 
     if (childNodes.Count > 0) 
     { 
      treeNodes.Add(new TreeNode(currentGroup, childNodes.ToArray())); 
      childNodes = new List<TreeNode>(); 
     } 
     currentGroup = obj.Group; 
    } 
} 
if (childNodes.Count > 0) 
{ 
    treeNodes.Add(new TreeNode(currentGroup, childNodes.ToArray())); 
} 
treeView.Nodes.AddRange(treeNodes.ToArray()); 
+0

我的問題是更技術。我剛剛按照您的說法完成了排序,但我不知道如何在每次組更改時創建頂級節點。 – user2346200 2013-05-03 11:38:30

0

這裏是一些在VB ...

嘗試

 Me.Cursor = Cursors.WaitCursor 
     If rtb.Visible Then line = rtb.Lines 
     Dim i, j As Integer 
     Dim myLst As New ListBox 
     Dim nod0 As New TreeNode 
     Dim nod1 As New TreeNode 
     Dim nodGet As New TreeNode 
     Dim nodSet As New TreeNode 
     'Aktualna pozicia 
     If trw.SelectedNode Is Nothing Then 
     Else 
      nodGet = trw.SelectedNode 
     End If 

     For Each nod0 In trw.Nodes 
      If nod0.IsExpanded Then 
       myLst.Items.Add(nod0.Tag) 
       For Each nod1 In nod0.Nodes 
        If nod1.IsExpanded Then myLst.Items.Add(nod1.Tag) 
       Next 
      End If 
     Next 

     Dim cntr() As Integer = {-1, -1, -1} 

     trw.Nodes.Clear() 
     trw.ShowPlusMinus = False 
     trw.ShowRootLines = False 
     trw.CheckBoxes = False 
     For i = 0 To UBound(line) 
      If Mid(line(i), 1, 1) = "\" Then 
       j = line(i).IndexOf(dod) 
       If j > 0 Then 
        s = Mid(line(i), 1, j) 
       Else 
        s = line(i) 
       End If 
       If Mid(s, 1, 4) = "\\\\" Then 
        trw.Nodes.Add(Mid(s, 5)) 
        cntr(0) = cntr(0) + 1 
        cntr(1) = -1 
        cntr(2) = -1 
        trw.Nodes(cntr(0)).Tag = s 
        trw.Nodes(cntr(0)).ImageIndex = 4 
        trw.Nodes(cntr(0)).SelectedImageIndex = 5 
        If trw.Nodes(cntr(0)).Tag = nodGet.Tag Then nodSet = trw.Nodes(cntr(0)) 
       Else 
        If Mid(s, 1, 3) = "\\\" Then 
         If cntr(0) = -1 Then trw.Nodes.Add("...") : cntr(0) = 0 : cntr(1) = -1 
         trw.Nodes(cntr(0)).Nodes.Add(Mid(s, 4)) 
         cntr(1) = cntr(1) + 1 
         cntr(2) = -1 
         trw.Nodes(cntr(0)).Nodes(cntr(1)).Tag = trw.Nodes(cntr(0)).Tag.ToString & eol & s 
         trw.Nodes(cntr(0)).Nodes(cntr(1)).ImageIndex = 1 
         trw.Nodes(cntr(0)).Nodes(cntr(1)).SelectedImageIndex = 2 
         If trw.Nodes(cntr(0)).Nodes(cntr(1)).Tag = nodGet.Tag Then nodSet = trw.Nodes(cntr(0)).Nodes(cntr(1)) 
        Else 
         If Mid(s, 1, 2) = "\\" Then 
          If cntr(0) = -1 Then trw.Nodes.Add("...") : cntr(0) = 0 : cntr(1) = -1 
          If cntr(1) = -1 Then trw.Nodes(cntr(0)).Nodes.Add("...") : cntr(1) = 0 : cntr(2) = -1 
          trw.Nodes(cntr(0)).Nodes(cntr(1)).Nodes.Add(Mid(s, 3)) 
          cntr(2) = cntr(2) + 1 
          trw.Nodes(cntr(0)).Nodes(cntr(1)).Nodes(cntr(2)).Tag = trw.Nodes(cntr(0)).Nodes(cntr(1)).Tag.ToString & eol & s 
          trw.Nodes(cntr(0)).Nodes(cntr(1)).Nodes(cntr(2)).ImageIndex = 3 
          trw.Nodes(cntr(0)).Nodes(cntr(1)).Nodes(cntr(2)).SelectedImageIndex = 4 
          If trw.Nodes(cntr(0)).Nodes(cntr(1)).Nodes(cntr(2)).Tag = nodSet.Tag Then nodSet = trw.Nodes(cntr(0)).Nodes(cntr(1)).Nodes(cntr(2)) 
         End If 
        End If 
       End If 
      End If 
     Next i 
     'Navrat na aktualnu poziciu 
     Application.DoEvents() 
     For i = 0 To myLst.Items.Count - 1 
      For Each nod0 In trw.Nodes 
       If nod0.Tag = myLst.Items(i).ToString Then nod0.Expand() 
       For Each nod1 In nod0.Nodes 
        If nod1.Tag = myLst.Items(i).ToString Then nod1.Expand() 
       Next 
      Next 
     Next i 
     Application.DoEvents() 
     If nodSet.Tag <> "" Then trw.SelectedNode = nodSet 
    Catch ex As Exception 
     MsgBox(ex.ToString, MsgBoxStyle.Exclamation) 
    Finally 
     Me.Cursor = Cursors.Default 
    End Try