当我滚动浏览数据网格并在可见屏幕上和关闭时选择项目时,它会抛出以下异常。
Object reference not set to an instance of an object.
Dim sn as string
是罪魁祸首......
For Each item In asset_MasterDataGrid.SelectedItems
If item IsNot Nothing Then
Dim snIndex As Integer = asset_MasterDataGrid.Columns.IndexOf(asset_MasterDataGrid.Columns.LastOrDefault(Function(c) c.Header = "serial num"))
Dim sn As String = DirectCast(asset_MasterDataGrid.SelectedCells(snIndex).Column.GetCellContent(item), TextBlock).Text
variables.selectedAssets.Add(sn)
End If
Next
当EnableRowVirtualization="True"
为真时,我收到错误。我假设这是因为一旦我滚动屏幕,在选择行时,这些行不再存在。
如何在不关闭虚拟化的情况下避免这种情况?
答案 0 :(得分:1)
这是最终版本,OP修正了我对VB语法的奇怪尝试:
Dim snIndex As Integer = asset_MasterDataGrid.Columns.IndexOf(asset_MasterDataGrid.Columns.LastOrDefault(Function(c) c.Header = "serial num"))
'loop through all selected datagrid rows.
For Each item In asset_MasterDataGrid.SelectedItems
'check to see if item has a NULL value, it shouldn't be though.
If item IsNot Nothing Then
'directcast item (selected item) to a datarowview.
Dim drv As DataRowView = DirectCast(item, DataRowView)
'declare serial number to a string.
Dim sn As String = drv.Row(snIndex)
'add all serial numbers to selected asset list (so we can get a list of all the selected sn's).
variables.selectedAssets.Add(sn)
End If
Next
我认为你得到的是空引用异常,因为你试图将所选项目的某些部分强制转换为TextBlock
,但是那里没有任何可投射的内容。
在WPF中,SelectedItems
表示在UI中显示的数据项,而不是实际的UI内容。它是您向ItemsSource
提供的整个集合项的子集 - 无论是什么,这都是用户点击网格时“选择”的内容。我不得不像我这样填充DataGrid
:
myDataGrid.ItemsSource = myDataTable.DefaultView;
DefaultView
返回实现DataView
的{{1}}。枚举它,它会为您提供IEnumerable
个实例。这些是DataRowView
在DataGrid
中为您提供的内容。
但我知道关于SelectedItems
几乎为零。如果你以其他方式做到了,如果是某种其他方式,你可能会得到别的东西。所以在该循环中放置一个断点并检查DataTable
;看看它是什么类型。它将代表你的一个数据行,或者我会吃掉我的帽子(1)。
(1)那是独家 OR。