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;
}