Home > database >  Retrieve list that is saved in a datatable
Retrieve list that is saved in a datatable

Time:10-17

I created a datatable containing the list of notes for songs:

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 and Yesterday are lists of notes (notes is a class containing note, duration etc..) On the form I then assign the datatable to a combobox:

ComboSongs.DisplayMember = Songs.DataTable.Columns(0).ColumnName
ComboSongs.ValueMember = Songs.DataTable.Columns(1).ColumnName
ComboSongs.DataSource = Songs.DataTable

I try to get the list of notes like this:

Dim songToPlay As List(Of Note) = CType(ComboSongs.SelectedValue, List(Of Note))

When I try to get the list I get the error:

System.InvalidCastException: 'Unable to cast object of type 'System.String' to type 'System.Collections.Generic.List`1[test.Note]'.'

Now I am unsure where I am getting it wrong. What would be the correct way to do this?

CodePudding user response:

Your ValueMember is what is returned through the ComboBox.SelectedValue. So since you set the ValueMember like this

ComboSongs.ValueMember = Songs.DataTable.Columns(1).ColumnName

you only get the ColumnName. I assume that's a string and, well, the error message tells you it is one

... Unable to cast object of type 'System.String' ...

I guess that should be "NoteList", since that would be returned by Songs.DataTable.Columns(1).ColumnName

But this all doesn't make much sense, as I guess you are selecting a song there, either "Yesterday" or "GOT". At the point you're at it's so convoluted to return the DataTable rows, and index them. You will need to find the row by name and that is just too complicated when you could just create a class with strong names. I'll give you a class based solution but I'm not sure if you can make that change.

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
  • Related