检索保存在数据表中的列表

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