C# 如何从对象列表填充树视图

C# 如何从对象列表填充树视图,c#,winforms,list,object,treeview,C#,Winforms,List,Object,Treeview,从对象列表填充树视图时遇到问题。我一直在谷歌上寻找解决方案,我发现了一些和我的问题很接近的话题,但他们都没有解决 我有一个每个对象的属性列表:名称和组 我想填充我的树视图,如下所示: +---Group 1 | | | +--------object.Name <-- | +--------object.Name <-- all objects with object.Group = Group 1 | +--------object.Name <-- | +

从对象列表填充树视图时遇到问题。我一直在谷歌上寻找解决方案,我发现了一些和我的问题很接近的话题,但他们都没有解决

我有一个每个对象的属性列表:名称和组

我想填充我的树视图,如下所示:

+---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 <--
|
+---第1组
|   |

|+----------object.Name您的问题是技术问题,还是如何解决?您可以按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());
string currentGroup=null;
列表树节点=新列表();
List childNodes=new List();
foreach(对象列表中的BusinessObject对象)
{
if(当前组==对象组)
Add(新的TreeNode(obj.Name));
其他的
{
如果(childNodes.Count>0)
{
添加(新的TreeNode(currentGroup,childNodes.ToArray());
childNodes=新列表();
}
当前组=对象组;
}
}
如果(childNodes.Count>0)
{
添加(新的TreeNode(currentGroup,childNodes.ToArray());
}
treeView.Nodes.AddRange(treeNodes.ToArray());

效果很好,谢谢。我刚刚在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());
    }
private void PopulateTreeView()
{
listofobjectsorted=ListOfObjects.OrderBy(r=>r.Group.ToList();
var topNode=新树节点(“全选”);
treeView1.Nodes.Add(topNode);
string currentGroup=ListofObject.First().Group;
var treeNodes=新列表();
var childNodes=新列表();
foreach(对象列表中的对象对象)
{
if(currentGroup==rule.Group)
Add(新的TreeNode(obj.Name));
其他的
{
如果(childNodes.Count>0)
{
添加(新的TreeNode(currentGroup,childNodes.ToArray());
childNodes=新列表();
}
Add(新的TreeNode(obj.Name));
当前组=对象组;
}
}
如果(childNodes.Count>0)
{
添加(新的TreeNode(currentGroup,childNodes.ToArray());
}
treeView1.Nodes[0].Nodes.AddRange(treeNodes.ToArray());
}
这里是VB中的一些

试一试

Me.Cursor=Cursors.WaitCursor
如果rtb.可见,则line=rtb.行
作为整数的Dim i,j
将myLst暗显为新列表框
Dim nod0作为新的TreeNode
Dim nod1作为新的TreeNode
Dim nodGet作为新的TreeNode
Dim节点集作为新的TreeNode
“Aktualna pozicia
如果trw.SelectedNode为Nothing,则
其他的
nodGet=trw.SelectedNode
如果结束
对于trw.Nodes中的每个nod0
如果nod0.i扩展,则
myLst.Items.Add(nod0.Tag)
对于nod0.Nodes中的每个nod1
如果nod1.IsExpanded,那么myLst.Items.Add(nod1.Tag)
下一个
如果结束
下一个
Dim cntr()作为整数={-1,-1,-1}
trw.Nodes.Clear()
trw.ShowPlusMinus=False
trw.showrotlines=False
trw.checkbox=False
对于i=0到UBound(线)
如果中间(第(i)行,1,1)=“\”则
j=第(i)行。索引(国防部)
如果j>0,则
s=中线(线(i),1,j)
其他的
s=第(i)行
如果结束
如果Mid(s,1,4)=“\\\\”则
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.节点(cntr(0))。选择图像索引=5
如果trw.Nodes(cntr(0)).Tag=nodGet.Tag,那么nodSet=trw.Nodes(cntr(0))
其他的
如果Mid(s,1,3)=“\\\”则
如果cntr(0)=-1,则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
如果trw.Nodes(cntr(0)).Nodes(cntr(1)).Tag=nodGet.Tag,则nodSet=trw.Nodes(cntr(0)).Nodes(cntr(1))
其他的
如果Mid(s,1,2)=“\\”则
如果cntr(0)=-1,则trw.Nodes.Add(“…”):cntr(0)=0:cntr(1)=-1
如果cntr(1)=-1,则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
如果trw.Nodes(cntr(0)).Nodes(cntr(1)).Nodes(cntr(2)).Tag=nodSet.Tag,则nodSet=trw.Nodes(cntr(0)).Nodes(cntr(1)).Nodes(cntr(2))
如果结束
如果结束
如果结束
如果结束
接下来我
“Navrat na aktualnu poziciu
Application.DoEvents()
对于i=0到myLst.Items.Count-1
对于trw.Nodes中的每个nod0
If nod0.Tag=
        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
   public void PrintProperties(TreeNode parentNode, object obj, int indent)
    {

        if (obj == null) return;
        string indentString = new string(' ', indent);
        Type objType = obj.GetType();
        PropertyInfo[] properties = objType.GetProperties();
        foreach (PropertyInfo property in properties)
        {
            object propValue = new object();
            if (property.CanRead)
                propValue = property.GetValue(obj, null);
            if (IsSimpleType(property.PropertyType))
            {
                //Console.WriteLine("{0}{1}:", indentString, property.Name);
                if (parentNode != null)
                {
                    parentNode.Nodes.Add(property.Name, property.Name +": " + (propValue != null ? propValue.ToString() : string.Empty));
                }
                else
                {
                    treeView.Nodes.Add(property.Name, property.Name + ": " + (propValue != null ? propValue.ToString() : string.Empty));
                }

            }

            else if (typeof(IEnumerable).IsAssignableFrom(property.PropertyType))
            {
                TreeNode node;
                if (parentNode != null)
                {
                    node = parentNode.Nodes.Add(property.Name, property.Name);
                }
                else
                {
                    node = treeView.Nodes.Add(property.Name, property.Name);
                }

                //Console.WriteLine("{0}{1}:", indentString, property.Name);
                IEnumerable enumerable = (IEnumerable)propValue;
                foreach (object child in enumerable)
                    PrintProperties(node, child, indent + 2);
            }
            else
            {

                TreeNode node;
                if (parentNode != null)
                {
                    node = parentNode.Nodes.Add(property.Name, property.Name);
                }
                else
                {
                    node = treeView.Nodes.Add(property.Name, property.Name);
                }

                PrintProperties(node, propValue, indent + 2);
            }
        }
    }

    public static bool IsSimpleType(Type type)
    {
        return
            type.IsValueType ||
            type.IsPrimitive ||
            new Type[]
            {
        typeof(String),
        typeof(Decimal),
        typeof(DateTime),
        typeof(DateTimeOffset),
        typeof(TimeSpan),
        typeof(Guid)
            }.Contains(type) ||
            Convert.GetTypeCode(type) != TypeCode.Object;
    }