为TreeView窗口窗体中的节点分配自定义属性
本文关键字:节点 分配 自定义属性 TreeView 窗口 窗体 | 更新日期: 2023-09-27 18:12:15
假设我有一个包含不同制造商的汽车的TreeView,然后是一个包含车型的子树,等等。如果我想让每个节点都有一组属性我该怎么做呢?我会创建一个新类,然后以某种方式将每个节点分配给一个类吗?我很难将其概念化,但我认为这是可能的。如果不能向每个成员添加数据,TreeView还有什么意义呢?
在carModelNode的右键菜单中,我有一个名为properties的选项。当用户单击它时,它会打开一个表单,用户然后在其中输入/编辑数据,例如汽车的年份、颜色、手册/汽车等。然后如何存储该数据并将其与该节点关联?是否有简单的方法来做到这一点,或者这将需要更多的jerry - rigged方法?
**请提供一些你正在谈论的例子,因为我仍然不太擅长语法!
编辑:我下面的尝试是为了@Ed Plunkett
具有我希望每个节点具有的属性的类:
public class CarProperties
{
public string type = "";
public string name = "";
public int year = 0;
public bool isManual = false;
}
现在尝试将这些属性分配给一个节点:
CarProperties FordFocus = new CarProperties();
FordFocus.name = "exampleName";
...
treeIO.SelectedNode.Tag = FordFocus;
这个看起来对吗?
有两种方法:最简单的方法是使用TreeNode
的Tag
属性。
public Form1()
{
InitializeComponent();
// Horrible example code -- in real life you'd have a method for this
foreach (var car in cars)
{
var tn = new TreeNode(car.name)
{
Tag = car
};
treeView1.Nodes.Add(tn);
}
}
public List<CarProperties> cars = new List<CarProperties>()
{
new CarProperties() { name = "Ford Focus" },
new CarProperties() { name = "TVR Tamora" },
new CarProperties() { name = "Toyota Tacoma" },
};
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
// This is a "cast": IF e.Node.Tag is actually an instance of CarProperties,
// the "as" operator converts it to a reference of that type, we assign
// that to the variable "car", and now you can use it's properties and methods.
var car = e.Node.Tag as CarProperties;
MessageBox.Show("Selected car " + car.name);
}