目前,我在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,树视图仍将显示默认名称。然后,当我点击屏幕1时,它的新名称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并更改它,则不会发生任何事情。
这种方式也被硬编码为仅与我的屏幕类相关。理论上,我可以简单地打开和关闭许多不同的文本框,但这将是非常糟糕的做法。而且我很确定它会对我的程序性能产生影响。
所以,我想要的是一个名称文本框,它将负责为每个需要名称的对象填写名称。然后,我想拿出我输入的名字并填写树视图。一旦我选择它,我希望我选择的节点用我为其放入的所有相关文本填写文本框。但是,如果我更改所选节点的名称,它还将更改树结构中的名称。
再次,抱歉,如果这令人困惑。我此刻很吵。