#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