【发布时间】:2016-11-16 13:12:21
【问题描述】:
我有一个相当简单的类结构,其中有 Graphic 对象,每个都包含一个 List<Symbol> 并且每个 Symbol 都包含一个 List<Alias>:amgonst 它们的其他属性。
显而易见的方法(和我当前的方法)是使用嵌套的foreach 循环来生成节点并填充树视图(这实际上工作正常),如下所示:
public void ToTree(TreeView treeControl)
{
treeControl.Nodes.Clear();
List<TreeNode> graphicsNodes = new List<TreeNode>();
foreach (Graphic graphic in Graphics)
{
List<TreeNode> symbolNodes = new List<TreeNode>();
foreach (Symbol symbol in graphic.Symbols)
{
List<TreeNode> aliasNodes = new List<TreeNode>();
foreach (Alias alias in symbol.Aliases)
{
aliasNodes.Add(new TreeNode(alias.AliasName + ": " + alias.AliasValue));
}
symbolNodes.Add(new TreeNode(symbol.SymbolName, aliasNodes.ToArray()));
}
graphicsNodes.Add(new TreeNode(graphic.FileName, symbolNodes.ToArray()));
}
treeControl.Nodes.AddRange(graphicsNodes.ToArray());
}
但是,我很好奇是否可以在我的类中实现任何东西,或者我可以重载任何方法,以便我可以简单地执行类似于treeView.Nodes.Add(graphic) 的操作。
理想情况下,这将允许我确定使用NodeClickEvent 单击哪个对象,而不必获取节点的文本然后单独执行搜索。
这样我就可以从该节点内直接访问每个对象的字段和成员,从而更容易从TreeView 点击事件中修改属性。
【问题讨论】:
-
如果您创建一个 TreeNodeCollection 对象,这将是可能的。但不太可能是根本性的改进。您应该使用 Begin/EndUpdate() 来避免过度绘制。
-
您介意详细说明这个 Beging/EndUpdate() 点吗?
-
@HansPassant 奇怪的是,TreeNodeCollection 没有公共构造函数,虽然它不是密封的(System.Web 中的那个是密封的),但这使得它几乎不可能尽可能地扩展它' t 子类化它或实例化它。除非你有绝招......