【问题标题】:Unable to cast custom listviewitem class in vb.net无法在 vb.net 中投射自定义 listviewitem 类
【发布时间】:2011-04-29 20:05:33
【问题描述】:

这是我之前提出的另一个问题的后续问题。我以为我有我需要的一切,但我遇到了另一个问题。我正在尝试使用将附加信息附加到 lisview 项目的自定义 listviewitem 类。这是课程:

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.Forms.ListViewItem' 类型的对象转换为 'AudioMatic.albumListViewItem'。”

我在这里错过了什么?

【问题讨论】:

    标签: vb.net listview inheritance casting listviewitem


    【解决方案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
    

    看看这个解决方案是否适合你。

    【讨论】:

    • 你很亲密。将信息存储在标签中工作正常,但要检索它,我必须使用它。 Dim albumInfo As albumListViewItem = CType(lsvAMalbums.SelectedItems(0), albumListViewItem)
    【解决方案2】:

    如果您单步执行代码并观察变量“lsvHidden.items.item(0)”,您应该能够首先判断它实际上是“albumListViewItem”类型还是其他类型。您确定最初添加到列表中的是 albumListViewItem 吗?

    您正在做的事情的一些替代方案; 1.你可以实现一个对象并将它存储在ListViewItem的标签中。 2. 下面的文章似乎描述了另一种将列添加到列表视图以允许在列表视图本身上存储额外信息的方法; http://www.codeproject.com/KB/list/ListViewExtendedItem.aspx

    我可以理解您的情况,因为我希望这会起作用。我也可以看到这样做的好处和原因。不确定代码项目示例是否适合您的需求,因此您需要查看该概念。

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2012-09-29
        • 2014-07-11
        • 2014-10-10
        • 1970-01-01
        • 2017-03-17
        • 2012-04-30
        • 2018-11-30
        • 1970-01-01
        • 2013-12-30
        相关资源
        最近更新 更多