【发布时间】:2014-04-03 11:30:35
【问题描述】:
使用 .NET 4 WinForms。
假设我们有一个类定义为:
public class Item
{
public int ID { get; set; }
public int Key { get; set; }
public int Value { get; set; }
}
还有一个清单:
List<Item> items;
其中包含以下项目:
Key Value
--- -----
1 1
1 2
1 3
4 4
4 5
2 6
2 7
7 8
我从这个列表中填充了一个 TreeView,这样根 Tree 节点就是那些具有相同 Key 和 Value 的节点。我就是这样做的:
var roots = items.Where(x => x.Key == x.Value);
foreach (var root in roots)
{
AddNode(treeView1.Nodes, root, items);
}
函数 AddNode 是一个递归函数,定义如下:
void AddNode(TreeNodeCollection nodes, Item current, IList<Item> items)
{
TreeNode treenode = nodes.Add(current.Value.ToString(), current.Value.ToString());
var children = items.Where(x => x.Key == current.Value && x.ID != current.ID);
foreach (var child in children)
{
AddNode(treenode.Nodes, child, items);
}
}
这将产生以下 TreeView 结构:
_1
|_2
| |_6
| |_7
| |_8
|
|_3
_4
|_5
但是,我想要创建一个结构,该结构仅包含那些具有至少一个子节点的根节点,该子节点至少有一个自己的子节点。在这种情况下,值为“1”的根项有一个值为“2”的子项,该子项又具有至少一个子项。根值“4”有一个值为“5”的孩子,但那个孩子没有孩子,所以我想省略它。生成的 TreeView 将如下所示:
_1
|_2
| |_6
| |_7
| |_8
|
|_3
为了更清楚,这是我在填充 TreeView 后用来清理 TreeView 的代码:
List<TreeNode> ToRemove = new List<TreeNode>();
foreach (TreeNode n in treeView1.Nodes)
{
if (n.Nodes.Count == 0)
ToRemove.Add(n);
else if (!n.Nodes.Cast<TreeNode>().Any(x => x.Nodes.Count > 0))
ToRemove.Add(n);
}
ToRemove.ForEach(x => treeView1.Nodes.Remove(x)));
如何在填充 TreeView 之前执行这种清理?
编辑
根据 Aaron 的建议,我将代码修改如下:
var roots = items.Where(x => x.Key == x.Value);
foreach (var root in roots)
{
Add2ndLevelNode(treeView1.Nodes, root, items);
}
“Add2ndLevelNode”函数如下所示:
void Add2ndLevelNode(TreeNodeCollection nodes, Item current, IList<Item> items)
{
var children = items.Where(x => x.Key == current.Value && x.ID != current.ID);
bool doIt = false;
foreach (var child in children)
{
if (items.Any(x => x.Key == child.Value))
doIt = true;
}
if (doIt)
{
TreeNode treenode = nodes.Add(current.Value.ToString(), current.Value.ToString());
foreach (var child in children)
{
AddNode(treenode.Nodes, child, items);
}
}
}
还有其他更优雅的方式吗?这样,它需要对孩子进行两次 for-each 循环。
【问题讨论】:
标签: c# winforms list treeview children