为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;

这个看起来对吗?

为TreeView窗口窗体中的节点分配自定义属性

有两种方法:最简单的方法是使用TreeNodeTag属性。

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);
}