winforms 是否将自定义属性分配给TreeView窗口窗体中的节点?

smdncfj3  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(150)

假设我有一个由不同制造商生产的汽车组成的TreeView,然后是一个由型号组成的子树,等等。如果我希望每个节点都有一组属性,我该怎么做呢?我会创建一个新类,然后以某种方式将每个节点分配给一个类吗?我很难将其概念化,但我认为这是可能的。如果不能向每个成员添加数据,那么TreeView还有什么意义呢?
在carModelNode的右键菜单中,我有一个名为properties的选项。当用户单击它时,它会打开一个表单,用户可以在其中输入/编辑数据,如汽车的年份、颜色、手动/自动等。然后,我如何存储这些数据并将其与该节点关联起来?有没有简单的方法来做到这一点,或者这将需要更多的偷工减料的方法?

**请提供一些例子,因为我仍然不太擅长语法!

编辑:我下面的尝试是@埃德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;

这个看起来对吗?

11dmarpk

11dmarpk1#

有两种方法:最简单的方法是使用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);
}

相关问题