首页 > 解决方案 > 无法将 ListView 转换为 ListViewItem

问题描述

这对我来说似乎很荒谬。我收到了一个 InvalidCastException,其中“无法将 'System.Windows.Forms.ListView' 类型的对象转换为在下面的星号行上键入 'System.Windows.Forms.ListViewItem':

Public Class FormX
    Public DT As DataTable
    Public trnBool As Boolean
    Dim lV As ListView
    Dim trnLVI As ListViewItem
    Dim PClviList As List(Of ListViewItem)

    Private Sub FormAllocationsLeaveTypes_Load(sender As Object, e As EventArgs) Handles Me.Load

        lV = ListViewLT

        lV.Items.Clear()
        lV.Groups.Clear()

        Dim lvGS As ListViewGroup, lvGP As ListViewGroup, lvI As ListViewItem

        lvGS = New ListViewGroup("Shift Type", HorizontalAlignment.Left)
        lvGP = New ListViewGroup("PC Types", HorizontalAlignment.Left)
        lV.Groups.AddRange({lvGS, lvGP})

        trnLVI = New ListViewItem("Training Shifts") With {.Checked = trnBool}
        lV.Items.Add(trnLVI).Group = lvGS '*** Exception occurs here

        PClviList = New List(Of ListViewItem)
        For Each LT As DataRow In DT.Rows
            lvI = New ListViewItem(LT("HrsType").ToString) With {.Checked = Not LT("Show").ToString = String.Empty}
            lV.Items.Add(lvI).Group = lvGP
            PClviList.Add(lvI)
        Next LT

    End Sub
End Class

异常使它看起来像是在说我的变量 trnLVI 是 ListView 类型。我什至在即时窗口中检查了 trnLVI.GetType.Name,它返回了 ListViewItem。

我试过前后分配组,没有区别。我也有几乎相同的语法在同一个项目的另一种形式中执行相同的操作,使用我复制的 ListView 来制作这个。唯一真正的区别是这个 ListView 只有 1 列,而该列有更多。

标签: vb.netlistview

解决方案


我已经想通了。你们不会相信这是多么愚蠢。这根本不是腐败。

即使在重建表单并获得相同的结果之后,它也没有任何意义。所以我决定发布它,看看它是否发生在发布的版本上。但是 JIT 调试器弹出并告诉我问题发生在我在代码“lvI_ItemChecked”中更进一步的事件中:

Private Sub lvI_ItemChecked(lvI As ListViewItem, e As ItemCheckedEventArgs) Handles ListViewLeaveTypes.ItemChecked

    changesMade = True
    ButtonSave.Enabled = True

End Sub

当我第一次编写该块时,我假设 listviewitem 启动触发器,而不是 listview 本身,所以我将发送者声明为 ListViewItem,而它实际上是一个 ListView。

现在这一切都变得更有意义了。


推荐阅读