检索保存在数据表中的列表
Retrieve list that is saved in a datatable
我创建了一个包含歌曲音符列表的数据表:
Private Table As New DataTable
Public Sub New()
With Table
.Columns.Add("Name")
.Columns.Add("NoteList")
.Rows.Add("GOT", GOT)
.Rows.Add("Yesterday", Yesterday)
End With
End Sub
GOT 和 Yesterday 是笔记列表(笔记是 class 包含笔记、持续时间等。)
然后在表单上将数据表分配给组合框:
ComboSongs.DisplayMember = Songs.DataTable.Columns(0).ColumnName
ComboSongs.ValueMember = Songs.DataTable.Columns(1).ColumnName
ComboSongs.DataSource = Songs.DataTable
我试着像这样获取笔记列表:
Dim songToPlay As List(Of Note) = CType(ComboSongs.SelectedValue, List(Of Note))
当我尝试获取列表时出现错误:
System.InvalidCastException: 'Unable to cast object of type 'System.String' to type 'System.Collections.Generic.List`1[test.Note]'.'
现在我不确定我哪里弄错了。执行此操作的正确方法是什么?
您的 ValueMember 是 return 通过 ComboBox.SelectedValue 编辑的内容。所以既然你这样设置 ValueMember
ComboSongs.ValueMember = Songs.DataTable.Columns(1).ColumnName
您只得到列名。我假设这是一个字符串,嗯,错误消息告诉你它是一个
... Unable to cast object of type 'System.String' ...
我想那应该是“NoteList”,因为它会被 Songs.DataTable.Columns(1).ColumnName
return编辑
但这一切都没有多大意义,因为我猜你正在那里选择一首歌,要么是“昨天”要么是“GOT”。在你所处的位置,它是如此复杂 return DataTable 行,并为它们编制索引。您将需要按名称查找行,当您可以创建具有强名称的 class 时,这太复杂了。我会给你一个基于 class 的解决方案,但我不确定你是否可以进行更改。
Private Class Song
Public Property Name As String
Public Property NoteList As List(Of Note)
End Class
Private Class Note
' your implementation
End Class
Dim songs As New List(Of Song)()
songs.Add(New Song() With {.Name = "GOT", .NoteList = New List(Of Note)})
songs.Add(New Song() With {.Name = "Yesterday", .NoteList = New List(Of Note)})
' need to populate those NoteLists first
ComboSongs.DisplayMember = "Name"
ComboSongs.DataSource = songs
Dim songToPlay = songs.SingleOrDefault(Function(s) s.Name = ComboSongs.SelectedValue)
Dim noteList = songToPlay.NoteList
我创建了一个包含歌曲音符列表的数据表:
Private Table As New DataTable
Public Sub New()
With Table
.Columns.Add("Name")
.Columns.Add("NoteList")
.Rows.Add("GOT", GOT)
.Rows.Add("Yesterday", Yesterday)
End With
End Sub
GOT 和 Yesterday 是笔记列表(笔记是 class 包含笔记、持续时间等。) 然后在表单上将数据表分配给组合框:
ComboSongs.DisplayMember = Songs.DataTable.Columns(0).ColumnName
ComboSongs.ValueMember = Songs.DataTable.Columns(1).ColumnName
ComboSongs.DataSource = Songs.DataTable
我试着像这样获取笔记列表:
Dim songToPlay As List(Of Note) = CType(ComboSongs.SelectedValue, List(Of Note))
当我尝试获取列表时出现错误:
System.InvalidCastException: 'Unable to cast object of type 'System.String' to type 'System.Collections.Generic.List`1[test.Note]'.'
现在我不确定我哪里弄错了。执行此操作的正确方法是什么?
您的 ValueMember 是 return 通过 ComboBox.SelectedValue 编辑的内容。所以既然你这样设置 ValueMember
ComboSongs.ValueMember = Songs.DataTable.Columns(1).ColumnName
您只得到列名。我假设这是一个字符串,嗯,错误消息告诉你它是一个
... Unable to cast object of type 'System.String' ...
我想那应该是“NoteList”,因为它会被 Songs.DataTable.Columns(1).ColumnName
但这一切都没有多大意义,因为我猜你正在那里选择一首歌,要么是“昨天”要么是“GOT”。在你所处的位置,它是如此复杂 return DataTable 行,并为它们编制索引。您将需要按名称查找行,当您可以创建具有强名称的 class 时,这太复杂了。我会给你一个基于 class 的解决方案,但我不确定你是否可以进行更改。
Private Class Song
Public Property Name As String
Public Property NoteList As List(Of Note)
End Class
Private Class Note
' your implementation
End Class
Dim songs As New List(Of Song)()
songs.Add(New Song() With {.Name = "GOT", .NoteList = New List(Of Note)})
songs.Add(New Song() With {.Name = "Yesterday", .NoteList = New List(Of Note)})
' need to populate those NoteLists first
ComboSongs.DisplayMember = "Name"
ComboSongs.DataSource = songs
Dim songToPlay = songs.SingleOrDefault(Function(s) s.Name = ComboSongs.SelectedValue)
Dim noteList = songToPlay.NoteList