C# 如何从对象列表填充树视图
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16355670/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to populate a treeview from a list of objects
提问by user2346200
I'm having a problem populating my treeview from my list of objects. I've been looking for solutions on google, I found some topic close to my problem, but none of them solved it.
我在从对象列表填充树视图时遇到问题。我一直在 google 上寻找解决方案,我找到了一些接近我的问题的主题,但没有一个解决它。
I have a List with properties for each object : Name and Group.
我有一个包含每个对象属性的列表:名称和组。
I would like to populate my treeview like below :
我想像下面一样填充我的树视图:
+---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 <--
|
and so on.
等等。
Thanks.
谢谢。
采纳答案by user2346200
Worked very well, thanks. I've just added a few lines at the beginning and at the end of the else as below.
工作得很好,谢谢。我刚刚在 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());
}
回答by David Cummins
Is your problem technical, or just how to approach it? You could sort by object.Group, and then create a top level node every time the group changes.
您的问题是技术问题还是解决方法?您可以按 object.Group 排序,然后在每次组更改时创建一个顶级节点。
Edit: Here's some sample code below, I have not tested it so treat it more as a guideline:
编辑:下面是一些示例代码,我尚未对其进行测试,因此将其更多地视为指导:
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());
回答by tibi
Here some in VB...
这里有一些在 VB 中...
Try
尝试
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
回答by PrepucioArgentino
5 years later....
5年后……
Call >> PrintProperties(null, yourObject, 0);
调用 >> PrintProperties(null, yourObject, 0);
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;
}

