我有几个包含标题和一些数据的文件,我想根据标题中的信息创建一个ViewTree。 (以下只是一个示例代码,真正的代码要长得多。)
文件(仅限示例)
DataFile 1 DataFile 2 DataFile 3 DataFile 4 etc.
Net 1 Net 1 Net 1 Net 2
Sub 1 Sub 2 Sub 2 Sub 1
Node 1 Node 1 Node 2 Node 1
以下代码确实将标题中的信息添加到ViewTree中,当我想使用选定的TreeViewNode时,问题出现了(在此问题中更进一步说明)
DataFile类
public class DataFile
{
public enum Header
{
NET,
SUB,
NODE
}
public string FilePath { get; set; }
public DataFile(string path) { FilePath = path; }
public string HeaderValue(int row)
{
return File.ReadLines(this.FilePath, Encoding.Default).Skip(row).First().Split('\t')[1];
}
}
myNode类
public class myNode : DataFile
{
public string Net { get { return HeaderValue((int)Header.Net); } }
public string Sub { get { return HeaderValue((int)Header.Sub); } }
public string Node { get { return HeaderValue((int)Header.Node); } }
public myNode(string path):base(path: path) { }
}
我使用以下函数填充TreeView
public static void PopulateTree(TreeView tree, string searchpath)
{
foreach(string datafile in Directory.GetFiles(searchpath, "datafile.txt", SearchOption.AllDirectories))
{
myNode node = new myNode(datafile);
if (!tree
.Nodes.ContainsKey(node.Net))
{
tree
.Nodes.Add(node.Net, node.Net);
if (!tree
.Nodes[node.Net]
.Nodes.ContainsKey(node.Sub))
{
tree
.Nodes[node.Net]
.Nodes.Add(node.Sub, node.Sub));
}
if (!tree
.Nodes[node.Net]
.Nodes[node.Sub]
.Nodes.ContainsKey(node.Node))
{
tree
.Nodes[node.Net]
.Nodes[node.Sub]
.Nodes.Add(node.Node, node.Node));
}
Application.DoEvents();
}
}
这给了我以下TreeView结构
1
├─1
│ └─1
└─2
├─1
└─2
2
└─1
└─1
一切都很好但不是很有用。我希望节点包含数据属性与DataFile中的值。所以我决定按照
创建我自己的TreeNode类public class myTreeNode : TreeNode
{
private enum Header
{
NET,
SUB,
NODE
}
public string SearchPath { get; set; }
public string Net { get; set; }
public string Sub { get; set; }
public string Node { get; set; }
public string HeaderValue(int row)
{
return File.ReadLines(this.SearchPath, Encoding.Default).Skip(row).First().Split('\t')[1];
}
public myTreeNode(string searchpath):base()
{
SearchPath = searchpath;
Net = HeaderValue((int)Header.Net);
Sub = HeaderValue((int)Header.Sub);
Node = HeaderValue((int)Header.Node);
}
}
我执行类似的功能来填充我的TreeView
myNode customNode = new myNode(datafile);
if (!tree
.Nodes.ContainsKey(customNode.Net))
tree
.Nodes.Add(customNode.Net, customNode.Net));
etc.
它填充我的TreeView,就像上一个函数一样。
问题:如何从NodeMouseDoubleClick访问我的自定义TreeNode?我尝试将myNode传递给事件中的函数,但是我得到异常无法将TreeNode转换为myNode类型。
例如
private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
myFunction((myNode)treeView1.SelectedNode); // also tried without (myNode) but got same exeption.
}