将XML文件链接到VB.NET中的ToolStripLabels

将XML文件链接到VB.NET中的ToolStripLabels,xml,vb.net,Xml,Vb.net,我正在尝试创建一个使用ToolStripLabels和ToolStripMenuItems的表单菜单。我希望从XML文件中提供信息和结构,以便在更新XML文件时动态更新菜单。 我已经开始对它进行编码,但是我正在努力找到映射数据的最佳方法,因此在菜单中有正确的结构来遵循XML结构 例如(为了简单起见),我的XML文件可以是 <?xml version="1.0" encoding="UTF-8"?> <Menu1> <subMenu1> <su

我正在尝试创建一个使用ToolStripLabels和ToolStripMenuItems的表单菜单。我希望从XML文件中提供信息和结构,以便在更新XML文件时动态更新菜单。 我已经开始对它进行编码,但是我正在努力找到映射数据的最佳方法,因此在菜单中有正确的结构来遵循XML结构

例如(为了简单起见),我的XML文件可以是

<?xml version="1.0" encoding="UTF-8"?>
<Menu1>
  <subMenu1>
    <subSubMenu1>1</subSubMenu1>
  </subMenu1>
</Menu1>

1.

我希望在ToolStripLabel1中映射Menu1,在ToolStripMenu1中映射Submenu1,在ToolStripMenuItem1中映射Submenu1,并在ToolStripTextBox中映射“1”。

我会稍微更改您的XML结构,因为它有点混乱。不要将
1
标识符放在元素名称中,而是将其放在属性中。我猜应该是菜单文本,所以我给了他们一些结构名称

这是我提出的一些XML


这些类可用于从XML文件反序列化并保存状态


公共类菜单
公共菜单项作为列表(菜单项的列表)
末级
公共类菜单项
作为字符串的公共文本
作为字符串的公共文本框
公共菜单项作为列表(菜单项的列表)
公共函数CreateToolStripMenuItem(IsubMenu为布尔值)作为ToolStripMenuItem
Dim tsmi=新的ToolStripMenuItem(Me.Text)
如果是IsubMenu,则添加处理程序tsmi.Click,Sub(发件人作为对象,e作为事件参数)MessageBox.Show($“您单击了{DirectCast(发件人,ToolStripMenuItem.Text}”)
如果是Me.TextBox“”,则
Dim tb=New ToolStripTextBox()和{.Text=Me.TextBox}
'tb.ReadOnly=True
tsmi.DropDownItems.Add(tb)
如果结束
如果我是MenuItems任何人
对于我身上的每一个mi.MenuItems
添加(mi.CreateToolStripMenuItem(True))
下一个
如果结束
返回tsmi
端函数
末级
还有一些测试代码。您所需要的只是一个带有此代码的空表单来测试它,以及一个可以加载“filename.XML”的XML文件

选项严格打开
导入System.IO
导入System.Xml.Xml
公开课表格1
私有子表单1_Load(发送方作为对象,e作为事件参数)处理MyBase.Load
加载菜单()
端接头
专用子加载菜单()
Dim s=新的XmlSerializer(GetType(菜单))
将菜单变暗为菜单
使用sr=newstreamreader(“filename.xml”)
menu=CType(反序列化(sr),菜单)
终端使用
Dim ms=新菜单列表()
对于menu.MenuItems中的每个项目
ms.Items.Add(item.CreateToolStripMenuItem(False))
下一个
ms.Visible=真
Me.Controls.Add(ms)
端接头
末级
它使用递归,因此在XML和.NET中只有一个菜单类,您可以拥有任何级别的菜单深度


支持在代码中添加单击事件处理程序。使用与否取决于您。

是否需要在运行时更改结构?或者只有在xml更改并且程序重新启动/表单重新加载后才可以更改吗?
在ToolStripLabel1中映射Menu1这意味着什么?如何将层次对象映射到单个标签?Menu1有子对象,但标签没有。您是否可以在designer中构建所需的菜单,并提供一个屏幕截图和更清晰的描述?还可以向xml中添加更多子项。具有单个元素的Xml模式是不明确的,特别是单个子节点是否可能是多个节点中的一个,或者始终只是一个节点。这非常好,非常感谢!!关于你提到的属性问题,我需要更多的建议。菜单(更具体地说是子菜单)实际上是链接的参数,最终将以数量特征的数字输入结束(因此我最初使用“1”)。你能告诉我如何添加一个文本框或输入记录,它也可以像你在菜单/子菜单中显示的那样被跟踪吗?我删除了前面的问题,因为我现在读了你的帖子——你已经用递归方法解释了更深层次的问题——谢谢。有没有一种方法可以输出一个链中涉及的所有项的字符串(直到我创建一个条目时为止——如上面的“1”)呢?很抱歉不断地向您发送请求,但是有没有一种方法可以在单击特定子菜单时确定特定的操作?再次感谢你的帮助@Cevillasenor I增加了对文本框的支持。我希望这有帮助我想知道是否有一种方法可以单击某个特定项目,我可以将与该项目相关的父节点MsgBox??如何
MsgBox父节点