怎么用Xml文档作菜单三级联动?

jonical 2021-01-17 10:35:11
比如有个Xml结构是这样的:

<?xml version="1.0" encoding="utf-8"?>
<Menu>
<Class Layer="1" Index="0" Name="皖">
<City Layer="2" Index="0" Name="10000">
</City>
<City Layer="2" Index="1" Name="10001">
</City>
<City Layer="2" Index="2" Name="10002">
</City>
</Class>
<Class Layer="1" Index="1" Name="浙">
<City Layer="2" Index="0" Name="20000">
</City>
<City Layer="2" Index="1" Name="20001">
</City>
<City Layer="2" Index="2" Name="20002">
</City>
</Class>
<Class Layer="1" Index="2" Name="冀">
<City Layer="2" Index="0" Name="30000">
</City>
<City Layer="2" Index="1" Name="30001">
</City>
<City Layer="2" Index="2" Name="30002">
</City>
</Class>
</Menu>

其中 Layer属性代表在哪个ComboBox中显示,Index代表显示的索引位置,Name代表显示的地区名称或代号。
使用两个ComboBox作两级菜单联动,如何实现?
ForEach遍历之后,没法办用Select case作判断。
...全文
960 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
良朋 2021-03-10
  • 打赏
  • 举报
回复
引用 8 楼 jonical 的回复:
[quote=引用 6 楼 兔子党逍遥 的回复:] 扁平化的读取所有数据,保存成key-value结构,然后用linq临时根据条件取就可以。这样最简单
VB.NET不支持linq,试过了[/quote] VB.NET怎么可能没有linq?! C#有的,VB.NET一般都有、反过来VB.NET有的,C#不见得有,最明显而且常用的就是Moudle。
年迈哒爱好者 2021-03-03
  • 打赏
  • 举报
回复 1
直接写TXT再转码
兔子-顾问 2021-02-07
  • 打赏
  • 举报
回复
引用 8 楼 jonical 的回复:
[quote=引用 6 楼 兔子党逍遥 的回复:] 扁平化的读取所有数据,保存成key-value结构,然后用linq临时根据条件取就可以。这样最简单
VB.NET不支持linq,试过了[/quote] 支持的,我给你写了个demo 链接:https://pan.baidu.com/s/1qGC7Bk-1fncBHdwWOtkZzg 提取码:7plm
  • 打赏
  • 举报
回复
引用 8 楼 jonical 的回复:
[quote=引用 6 楼 兔子党逍遥 的回复:] 扁平化的读取所有数据,保存成key-value结构,然后用linq临时根据条件取就可以。这样最简单

VB.NET不支持linq,试过了[/quote]


VB.NET支持linq
  • 打赏
  • 举报
回复
引用 7 楼 jonical 的回复:
[quote=引用 4 楼 骷髅会-北极熊 的回复:]用1楼的C#改的VB.Net

Public Class MyMenu
Public Property Name() As String
Public Property Value() As String
End Class

Private Menus As New List(Of MyMenu)

Public Sub GetMenus()
comboBox1.Items.Clear()
Dim xmlFilePath As String = "menu.xml"
Dim doc As New XmlDocument()
doc.Load(xmlFilePath)
Menus.Clear()
Dim ClassNodeList As XmlNodeList = doc.SelectNodes("/Menu/Class")
For Each item As XmlNode In ClassNodeList

Dim Name As String = item.Attributes("Name").Value
Dim CityNodes As XmlNodeList= item.ChildNodes
For Each CityItem As XmlNode In CityNodes
Dim MenuItem As New MyMenu()
MenuItem.Name = Name
MenuItem.Value = CityItem.Attributes("Name").Value
Menus.Add(MenuItem)
Next CityItem
comboBox1.Items.Add(Name)
Next item
End Sub

Private Sub comboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
comboBox2.Items.Clear()
comboBox2.Text = ""
Dim aa = Menus.Where(Function(p) p.Name = comboBox1.Text)
For Each item In aa
comboBox2.Items.Add(item.Value)
Next item

End Sub


引用 4 楼 骷髅会-北极熊 的回复:
用1楼的C#改的VB.Net

Public Class MyMenu
Public Property Name() As String
Public Property Value() As String
End Class

Private Menus As New List(Of MyMenu)

Public Sub GetMenus()
comboBox1.Items.Clear()
Dim xmlFilePath As String = "menu.xml"
Dim doc As New XmlDocument()
doc.Load(xmlFilePath)
Menus.Clear()
Dim ClassNodeList As XmlNodeList = doc.SelectNodes("/Menu/Class")
For Each item As XmlNode In ClassNodeList

Dim Name As String = item.Attributes("Name").Value
Dim CityNodes As XmlNodeList= item.ChildNodes
For Each CityItem As XmlNode In CityNodes
Dim MenuItem As New MyMenu()
MenuItem.Name = Name
MenuItem.Value = CityItem.Attributes("Name").Value
Menus.Add(MenuItem)
Next CityItem
comboBox1.Items.Add(Name)
Next item
End Sub

Private Sub comboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
comboBox2.Items.Clear()
comboBox2.Text = ""
Dim aa = Menus.Where(Function(p) p.Name = comboBox1.Text)
For Each item In aa
comboBox2.Items.Add(item.Value)
Next item

End Sub


引用 4 楼 骷髅会-北极熊 的回复:
用1楼的C#改的VB.Net

Public Class MyMenu
Public Property Name() As String
Public Property Value() As String
End Class

Private Menus As New List(Of MyMenu)

Public Sub GetMenus()
comboBox1.Items.Clear()
Dim xmlFilePath As String = "menu.xml"
Dim doc As New XmlDocument()
doc.Load(xmlFilePath)
Menus.Clear()
Dim ClassNodeList As XmlNodeList = doc.SelectNodes("/Menu/Class")
For Each item As XmlNode In ClassNodeList

Dim Name As String = item.Attributes("Name").Value
Dim CityNodes As XmlNodeList= item.ChildNodes
For Each CityItem As XmlNode In CityNodes
Dim MenuItem As New MyMenu()
MenuItem.Name = Name
MenuItem.Value = CityItem.Attributes("Name").Value
Menus.Add(MenuItem)
Next CityItem
comboBox1.Items.Add(Name)
Next item
End Sub

Private Sub comboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
comboBox2.Items.Clear()
comboBox2.Text = ""
Dim aa = Menus.Where(Function(p) p.Name = comboBox1.Text)
For Each item In aa
comboBox2.Items.Add(item.Value)
Next item

End Sub

你这个不能用,不显示数据。[/quote]

我这边正常显示!
jonical 2021-02-02
  • 打赏
  • 举报
回复
引用 5 楼 Stock king 的回复:
这个问题基本是简单处理就行,这个情况已经复杂处理了
比如说?
jonical 2021-02-02
  • 打赏
  • 举报
回复
引用 6 楼 兔子党逍遥 的回复:
扁平化的读取所有数据,保存成key-value结构,然后用linq临时根据条件取就可以。这样最简单
VB.NET不支持linq,试过了
jonical 2021-02-02
  • 打赏
  • 举报
回复
引用 4 楼 骷髅会-北极熊 的回复:
用1楼的C#改的VB.Net

  Public Class MyMenu
			Public Property Name() As String
			Public Property Value() As String
  End Class

 Private Menus As New List(Of MyMenu)

Public Sub GetMenus()
	comboBox1.Items.Clear()
			Dim xmlFilePath As String = "menu.xml"
			 Dim doc As New XmlDocument()
			 doc.Load(xmlFilePath)
			Menus.Clear()
			   Dim ClassNodeList As XmlNodeList = doc.SelectNodes("/Menu/Class")
			For Each item As XmlNode In ClassNodeList

				Dim Name As String = item.Attributes("Name").Value
				Dim CityNodes As XmlNodeList= item.ChildNodes
				For Each CityItem As XmlNode In CityNodes
					Dim MenuItem As New MyMenu()
					MenuItem.Name = Name
					MenuItem.Value = CityItem.Attributes("Name").Value
					Menus.Add(MenuItem)
				Next CityItem
				comboBox1.Items.Add(Name)
			Next item
End Sub

 Private Sub comboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
			comboBox2.Items.Clear()
			comboBox2.Text = ""
			Dim aa = Menus.Where(Function(p) p.Name = comboBox1.Text)
			For Each item In aa
				comboBox2.Items.Add(item.Value)
			Next item

 End Sub
引用 4 楼 骷髅会-北极熊 的回复:
用1楼的C#改的VB.Net

  Public Class MyMenu
			Public Property Name() As String
			Public Property Value() As String
  End Class

 Private Menus As New List(Of MyMenu)

Public Sub GetMenus()
	comboBox1.Items.Clear()
			Dim xmlFilePath As String = "menu.xml"
			 Dim doc As New XmlDocument()
			 doc.Load(xmlFilePath)
			Menus.Clear()
			   Dim ClassNodeList As XmlNodeList = doc.SelectNodes("/Menu/Class")
			For Each item As XmlNode In ClassNodeList

				Dim Name As String = item.Attributes("Name").Value
				Dim CityNodes As XmlNodeList= item.ChildNodes
				For Each CityItem As XmlNode In CityNodes
					Dim MenuItem As New MyMenu()
					MenuItem.Name = Name
					MenuItem.Value = CityItem.Attributes("Name").Value
					Menus.Add(MenuItem)
				Next CityItem
				comboBox1.Items.Add(Name)
			Next item
End Sub

 Private Sub comboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
			comboBox2.Items.Clear()
			comboBox2.Text = ""
			Dim aa = Menus.Where(Function(p) p.Name = comboBox1.Text)
			For Each item In aa
				comboBox2.Items.Add(item.Value)
			Next item

 End Sub
引用 4 楼 骷髅会-北极熊 的回复:
用1楼的C#改的VB.Net

  Public Class MyMenu
			Public Property Name() As String
			Public Property Value() As String
  End Class

 Private Menus As New List(Of MyMenu)

Public Sub GetMenus()
	comboBox1.Items.Clear()
			Dim xmlFilePath As String = "menu.xml"
			 Dim doc As New XmlDocument()
			 doc.Load(xmlFilePath)
			Menus.Clear()
			   Dim ClassNodeList As XmlNodeList = doc.SelectNodes("/Menu/Class")
			For Each item As XmlNode In ClassNodeList

				Dim Name As String = item.Attributes("Name").Value
				Dim CityNodes As XmlNodeList= item.ChildNodes
				For Each CityItem As XmlNode In CityNodes
					Dim MenuItem As New MyMenu()
					MenuItem.Name = Name
					MenuItem.Value = CityItem.Attributes("Name").Value
					Menus.Add(MenuItem)
				Next CityItem
				comboBox1.Items.Add(Name)
			Next item
End Sub

 Private Sub comboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
			comboBox2.Items.Clear()
			comboBox2.Text = ""
			Dim aa = Menus.Where(Function(p) p.Name = comboBox1.Text)
			For Each item In aa
				comboBox2.Items.Add(item.Value)
			Next item

 End Sub
你这个不能用,不显示数据。
兔子-顾问 2021-01-26
  • 打赏
  • 举报
回复
扁平化的读取所有数据,保存成key-value结构,然后用linq临时根据条件取就可以。这样最简单
  • 打赏
  • 举报
回复
用1楼的C#改的VB.Net

Public Class MyMenu
Public Property Name() As String
Public Property Value() As String
End Class

Private Menus As New List(Of MyMenu)

Public Sub GetMenus()
comboBox1.Items.Clear()
Dim xmlFilePath As String = "menu.xml"
Dim doc As New XmlDocument()
doc.Load(xmlFilePath)
Menus.Clear()
Dim ClassNodeList As XmlNodeList = doc.SelectNodes("/Menu/Class")
For Each item As XmlNode In ClassNodeList

Dim Name As String = item.Attributes("Name").Value
Dim CityNodes As XmlNodeList= item.ChildNodes
For Each CityItem As XmlNode In CityNodes
Dim MenuItem As New MyMenu()
MenuItem.Name = Name
MenuItem.Value = CityItem.Attributes("Name").Value
Menus.Add(MenuItem)
Next CityItem
comboBox1.Items.Add(Name)
Next item
End Sub

Private Sub comboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
comboBox2.Items.Clear()
comboBox2.Text = ""
Dim aa = Menus.Where(Function(p) p.Name = comboBox1.Text)
For Each item In aa
comboBox2.Items.Add(item.Value)
Next item

End Sub
Stock king 2021-01-22
  • 打赏
  • 举报
回复
这个问题基本是简单处理就行,这个情况已经复杂处理了
jonical 2021-01-20
  • 打赏
  • 举报
回复
引用 2 楼 it_gz_xi的回复:
C#的代码,自己改VB的。 需要怎么联动和索引自己处理一下
是这样的效果,vb.net好像不支持支持list集合?只在java中能熟练作用,我查一下资料吧
it_gz_xi 2021-01-19
  • 打赏
  • 举报
回复
C#的代码,自己改VB的。 需要怎么联动和索引自己处理一下
it_gz_xi 2021-01-19
  • 打赏
  • 举报
回复
是这种效果吗?
 List<MyMenu> Menus = new List<MyMenu>();

  public class  MyMenu
        {
            public string Name { set; get; }
            public string Value { set; get; }
        }

Public void GetMenus()
{
    comboBox1.Items.Clear();
            string xmlFilePath = "menu.xml";
             XmlDocument doc = new XmlDocument();
             doc.Load(xmlFilePath);
            Menus.Clear();
               XmlNodeList ClassNodeList = doc.SelectNodes("/Menu/Class");
            foreach (XmlNode item in ClassNodeList)
            {
                
                string Name = item.Attributes["Name"].Value;
                XmlNodeList CityNodes= item.ChildNodes;
                foreach (XmlNode CityItem in CityNodes)
                {
                    MyMenu MenuItem=new MyMenu();
                    MenuItem.Name = Name;
                    MenuItem.Value = CityItem.Attributes["Name"].Value;
                    Menus.Add(MenuItem);
                }
                comboBox1.Items.Add(Name);
            }
}

 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            comboBox2.Items.Clear();
            comboBox2.Text = "";
            var aa = Menus.Where(p => p.Name == comboBox1.Text);
            foreach (var item in aa)
            {
                comboBox2.Items.Add(item.Value);
            }
         
        }

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧