2013-05-03 75 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