我有一个相当简单的类结构,其中有 Graphic
对象,每个包含一个 List<Symbol>
每个 Symbol
包含 List<Alias>
: amgonst 他们的其他属性。
显而易见的方法(也是我目前的方法)是使用嵌套 foreach
循环生成节点并填充 TreeView (这实际上工作正常)如下所示:
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
修改属性点击事件。
最佳答案
您可以做的是创建 TreeNode
的子类在他们的构造函数中接受你的类。然后,您可以让每个子类实现该类型的特定处理。我查看了 suggestion from Hans用 TreeNodeCollection
做一些有用的事情,但是这个类没有公共(public)构造函数,所以我不知道它应该如何工作。
我从您的示例中提取的三个类的简单实现如下所示:
图形和图形节点
public class GraphicNode:TreeNode
{
// takes a Graphic instance
public GraphicNode(Graphic grp)
{
// how do you want to represent it
this.Text = grp.FileName;
// and this class 'knows' how to handle its children
Nodes.AddRange(grp.Symbols.Select(s => new SymbolNode(s)).ToArray());
}
}
符号和符号节点
public class SymbolNode:TreeNode
{
public SymbolNode(Symbol sym)
{
this.Text = sym.SymbolName;
Nodes.AddRange(sym.Aliases.Select(ali => new AliasesNode(ali)).ToArray());
}
}
别名和别名节点
注意此类如何实现公共(public) Click
方法。您可以从 NodeMouseClick
事件中利用它。
public class AliasesNode:TreeNode
{
public AliasesNode(Aliases al)
{
this.Text = String.Format("{0} - {1}", al.AliasName, al.AliasValue);
}
public void Click()
{
MessageBox.Show(new String(this.Text.Reverse().ToArray()));
}
}
填充 TreeView
以下代码通过添加图形节点来填充 TreeView 。通过调用 BeginUpdate
首先,我们防止控件在添加的每个节点上绘制其内容。不要忘记调用EndUpdate
所以控件布局并重绘所有新添加的节点。请注意,您只需要在此处添加 GraphicNodes
,其他节点的添加由子类 TreeNodes 处理。
// tell the control to hold its paint/redraw events until
// we're done adding all items
tv.BeginUpdate();
foreach(var g in graphics)
{
tv.Nodes.Add(new GraphicNode(g));
}
// done, draw all nodes now
tv.EndUpdate();
如果将 NodeMouseClick 连接到以下事件处理程序,您可以深入到 TreeNode 的具体实现:
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
var node = e.Node as AliasesNode;
if (node != null)
{
node.Click();
}
}
当我们单击 AliasTreenode 时,我们应该看到在该类的 Click
方法中实现的 MessageBox 弹出窗口:
关于c# - 从对象填充 TreeView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40633051/