1

目前,我在 winform 中使用以下代码设置了硬编码树视图:

        private void Form1_Load_1(object sender, EventArgs e)
    {
        TreeNode _leftCameraNode = new TreeNode("LeftCamera");
        TreeNode _rightCameraNode = new TreeNode("RightCamera");
        TreeNode[] stereoCameraArray = new TreeNode[] { _leftCameraNode, _rightCameraNode };

        TreeNode _screenNode = new TreeNode("Screen");
        TreeNode _cameraNode = new TreeNode("Camera", stereoCameraArray);

        TreeNode[] headNodeArray = new TreeNode[] { _cameraNode };
        TreeNode _headNode = new TreeNode("HeadNode", headNodeArray);

        TreeNode[] centreNodeArray = new TreeNode[] { _screenNode, _headNode };
        TreeNode _centreNode = new TreeNode("CentreNode", centreNodeArray);

        // root node
        TreeNode[] inmoRootNodeArray = new TreeNode[] { _centreNode };
        TreeNode treeNode = new TreeNode("Main Node", inmoRootNodeArray);
        treeView1.Nodes.Add(treeNode);
    }

这很好用,但是它的功能非常有限。我真正想要做的是从我设置的节点列表中填充,并填写我从表单上的一堆文本框中获得的信息。

例如,我创建了一个新的屏幕列表(我的节点类的子节点),如下所示:

    public  List<HV_Screen> _screenList = new List<HV_Screen>();

然后我用从我的文本框中输入的数据填写我的列表,如下所示:

     if (_selectedNode > -1)
        {
            Node n = _nodeList[_nodeList.Count - 1];
            n.Name = _screenName;
        }

我一直在网上和stackoverflow上四处寻找,但找不到任何可以帮助我动态创建树视图的东西,所以我想知道是否有人能够指出我正确的方向并帮助我这个怎么做?

我想这样做的原因是,假设我有 3 个不同的屏幕实例,我希望我的树视图显示这个,然后如果我将 screen1 中的名称更改为 MYSCREEN,我希望我的树视图显示这个。但是,如果我单击 screen2,树视图仍将显示默认名称。然后,当我返回 screen1 时,它的新名称 MYSCREEN 仍会显示。

我希望这是有道理的。

编辑

继这里的评论之后是我当前 GUI 的屏幕截图: 在此处输入图像描述

那里的树结构都用上面的代码硬编码。这不会从我的班级屏幕班级中获取任何信息。

现在,我的 HV_Screen 类如下所示:

 private string WIDTH;
    private string HEIGHT;

    public string Width
    {
        get { return WIDTH; }
        set { WIDTH = value; }
    }

    public string Height
    {
        get { return HEIGHT; }
        set { HEIGHT = value; }
    }

    public override List<XmlElement> GenerateXML(XmlDocument _xmlDoc)
    {

       List<XmlElement> elementList = new List<XmlElement>();

        XmlElement _screenName = _xmlDoc.CreateElement("ScreenName");
        _screenName.SetAttribute("Name", name.ToString());
        _screenName.InnerText = name.ToString();
        elementList.Add(_screenName);

        XmlElement _screenTag = _xmlDoc.CreateElement("ScreenTag");
        _screenTag.SetAttribute("Tag", tag.ToString());
        _screenTag.InnerText = tag.ToString();
        elementList.Add(_screenTag);

        XmlElement _localPosition = _xmlDoc.CreateElement("LocalPosition");
        _localPosition.SetAttribute("X", XPOS.ToString());
        _localPosition.SetAttribute("Y", YPOS.ToString());
        _localPosition.SetAttribute("Z", ZPOS.ToString());
        _localPosition.InnerText = WorldPos.ToString();
        elementList.Add(_localPosition);


        XmlElement _orientation = _xmlDoc.CreateElement("Orientation");
        _orientation.SetAttribute("Yaw", YAW.ToString());
        _orientation.SetAttribute("Pitch", PITCH.ToString());
        _orientation.SetAttribute("Roll", ROLL.ToString());
        _orientation.InnerText = Orientation.ToString();
        elementList.Add(_orientation);

        XmlElement _width = _xmlDoc.CreateElement("Width");
        _width.SetAttribute("Width", WIDTH.ToString());
        _width.InnerText = WIDTH.ToString();
        elementList.Add(_width);

        XmlElement _height = _xmlDoc.CreateElement("Height");
        _height.SetAttribute("Height", HEIGHT.ToString());
        _height.InnerText = HEIGHT.ToString();
        elementList.Add(_height);

        return elementList;
    }

没什么大不了的。这只是获取信息并将其写入 xml 文件。我计划为我的每个 Node 孩子做这件事。所以,如果我有一个相机类,它会有自己的生成 XML 函数并从那里写出来。我的基类(节点)只有一堆 getter 和 setter,用于名称、标签等。

通过目前设置代码的方式,我可以添加新节点。首先,我必须选择要从中分支的根节点,然后填写与其相关的信息。所以在那个屏幕截图中,如果我选择主节点然后点击添加按钮,样本名称现在将是主节点的子节点。但是,如果我选择 Sample 和 Name 并更改它,则不会发生任何事情。

这种方式也被硬编码为仅与我的屏幕类有关。理论上,我可以简单地打开和关闭许多不同的文本框,但这确实是一种糟糕的做法。而且我很确定它会对我的程序性能产生影响。

再说一次,我想要的是一个名称文本框,它将负责为每个需要名称的对象填写名称。然后,我希望使用我输入的名称并让它填写树视图。一旦我选择了它,我希望我选择的节点用我为其输入的所有相关文本填充文本框。但是,如果我更改所选节点的名称,它也会更改树结构中的名称。

再次,对不起,如果这令人困惑。我现在很受打击。

4

0 回答 0