我需要有7个节点,每个节点内部有近30-40个子节点。每个子节点都需要有一个自己的“函数体”,就像我们在C#中的Form1中工作时可以拥有一个普通的单一复选框一样。这样我就可以自由地为它分配唯一的任务(比如获取唯一数据,字符串连接以及将值解析为另一个函数)。我需要基本上访问每个复选框。 到目前为止,我在创建树列表后尝试过(为简单起见,只显示了几行):
treeView1.Nodes.Add("Session");
treeView1.Nodes.Add("Reset");
treeView1.Nodes[0].Nodes.Add("Extended Start");
treeView1.Nodes[1].Nodes.Add("Hard Reset");
treeView1.Nodes[2].Nodes.Add("EOL Mode State Read");
treeView1.Nodes[2].Nodes.Add("Current Err Tracer Read");
treeView1.Nodes[2].Nodes.Add("Read Odometer value from Bus Read");
这会生成我需要的树视图GUI,但访问复选框是我的主要问题!
由于
答案 0 :(得分:0)
您可以使用委托属性定义自定义树节点,该属性包含执行任务的一些代码,例如:
class ActionNode : TreeNode
{
public Action Action { get; }
public ActionNode(string text, Action action)
: base(text)
{
Action = action;
}
}
然后将此类的实例添加为子节点,为每个实例分配具体的任务代码。例如:
treeView1.Nodes[0].Nodes.Add(new ActionNode("Extended Start",
() => { MessageBox.Show("Extended Start"); }));
treeView1.Nodes[1].Nodes.Add(new ActionNode("Hard Reset",
() => { MessageBox.Show("Hard Reset"); }));
treeView1.Nodes[2].Nodes.Add(new ActionNode("EOL Mode State Read",
() => { MessageBox.Show("EOL Mode State Read"); }));
treeView1.Nodes[2].Nodes.Add(new ActionNode("Current Err Tracer Read",
() => { MessageBox.Show("Current Err Tracer Read"); }));
treeView1.Nodes[2].Nodes.Add(new ActionNode("Read Odometer value from Bus Read",
() => { MessageBox.Show("Read Odometer value from Bus Read"); }));
(注意:顶级节点的实现可以保留原样。)
然后,您可以使用节点访问如下所示的唯一任务代码:
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
var actionNode = e.Node as ActionNode;
if (actionNode != null)
actionNode.Action();
}