Невозможно привести пользовательский класс listviewitem в vb.net

#vb.net #listview #inheritance #casting #listviewitem

#vb.net #listview #наследование #Кастинг #listviewitem

Вопрос:

Это следующий вопрос к другому вопросу, который я задавал ранее. Я думал, что у меня есть все, что мне нужно, но я столкнулся с другой проблемой. Я пытаюсь использовать пользовательский класс listviewitem, который присоединяет дополнительную информацию к элементу lisview. Вот класс:

 Public Class albumListViewItem
    Inherits ListViewItem
    Public hash As String
    Public id As Integer
    Public provider As String
    Public providerID As String
    Public providerURL As String
    Public providerArtistID As String
    Public albumName As String
    Public albumType As String
    Public numTracks As Integer
    Public imageURLs() As String
    Public genres() As String
    Public styles() As String
    Public label As String
    Public year As String
    Public country As String
    Public rating As String
    Public editorsPick As Boolean
    Public sampleStreamURL As String
    Public providerReview As String
End Class
  

Когда я пытаюсь привести listviewitem к моему пользовательскому классу следующим образом:

 Dim albumItem As albumListViewItem = CType(lsvHidden.items.item(0), albumListViewItem)
  

Я получаю следующую ошибку: «Не удается привести объект типа ‘System.Windows.Формы.ListViewItem’ для ввода ‘AudioMatic.albumListViewItem’.»

Чего мне здесь не хватает?

Ответ №1:

Исходя из вашего предыдущего вопроса и этого, я думаю, что лучше всего для вашей проблемы было бы использовать обычный ListViewItem и хранить информацию о аксессуарах в ListViewItem.Tag

Вы можете сделать

 Dim listViewItem As New ListViewItem("SomeText")
Dim albumInfo As New albumListViewItem()

albumInfo.albumName = "SomeAlbum"
...
listViewItem.Tag = albumInfo

listView1.Items.Add(listViewItem)
  

а затем извлечь его следующим образом

 Dim selectedItem As ListViewItem = listView1.SelectedItems(0).Item
Dim alubmInfo As albumListViewItem = TryCast(selectedItem.Tag, alubmListViewItem)

Dim albumName as String = albumInfo.albumName
  

посмотрите, сработает ли это решение для вас.

Комментарии:

1. Вы были близки. Сохранение информации в теге работало нормально, но для ее извлечения мне пришлось использовать это. Затемнить albumInfo как albumListViewItem = CType(lsvAMalbums. Выбранные элементы (0), albumListViewItem)

Ответ №2:

Если вы пройдетесь по коду и посмотрите переменную «lsvHidden.items.item(0)», вы должны быть в состоянии сначала определить, имеет ли она на самом деле тип «albumListViewItem» или что-то еще. Вы уверены, что именно albumListViewItem был добавлен в список в первую очередь?

Некоторые альтернативы тому, что вы делаете; 1. Вы можете реализовать объект и сохранить его в теге ListViewItem. 2. Следующая статья, похоже, описывает другой подход добавления столбцов в listview, позволяющий хранить дополнительную информацию в самом listview; http://www.codeproject.com/KB/list/ListViewExtendedItem.aspx

Я могу оценить вашу ситуацию, поскольку я ожидал, что это сработает. И я также вижу преимущества и причины для того, чтобы делать это таким образом. Не уверен, что пример проекта code можно адаптировать к тому, что вам нужно, поэтому вам нужно просмотреть концепцию.

Ответ №3:

Рабочий код:

 Public Class albumListViewItem
    Inherits ListViewItem
    Public hash As String
    Public id As Integer
    Public provider As String
    Public providerID As String
    Public providerURL As String
    Public providerArtistID As String
    Public albumName As String
    Public albumType As String
    Public numTracks As Integer
    Public imageURLs() As String
    Public genres() As String
    Public styles() As String
    Public label As String
    Public year As String
    Public country As String
    Public rating As String
    Public editorsPick As Boolean
    Public sampleStreamURL As String
    Public providerReview As String
End Class
  

Сохранение информации с помощью listviewitem.tag:

 Dim listViewItem As New ListViewItem("SomeText")
Dim albumItem As New albumListViewItem

albumItem.albumName = "Test Album"
albumItem.id = "testid"
albumItem.Text = albumItem.albumName
albumItem.year = "2011"
albumItem.numTracks = 10
'....
listViewItem.Tag = albumItem
'add viewable items to listview
albumItem.SubItems.Add(albumItem.year)
albumItem.SubItems.Add(albumItem.numTracks)
'....
ListView1.Items.Add(albumItem)
  

Чтение информации, которая была ранее сохранена:

 Dim albumInfo As albumListViewItem = CType(ListView1.SelectedItems(0), albumListViewItem)
Dim id as string = alumInfo.id