每个循环异常的DataGrid SelectedItems

时间:2016-08-26 17:14:36

标签: wpf vb.net datagrid

当我滚动浏览数据网格并在可见屏幕上和关闭时选择项目时,它会抛出以下异常。

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"为真时,我收到错误。我假设这是因为一旦我滚动屏幕,在选择行时,这些行不再存在。

如何在不关闭虚拟化的情况下避免这种情况?

1 个答案:

答案 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个实例。这些是DataRowViewDataGrid中为您提供的内容。

但我知道关于SelectedItems几乎为零。如果你以其他方式做到了,如果某种其他方式,你可能会得到别的东西。所以在该循环中放置一个断点并检查DataTable;看看它是什么类型。它将代表你的一个数据行,或者我会吃掉我的帽子(1)。

(1)那是独家 OR。