【问题标题】:DataGrid SelectedItems for each loop exception每个循环异常的 DataGrid SelectedItems
【发布时间】:2017-01-03 10:27:01
【问题描述】:

当我在数据网格中滚动并在可见屏幕内外选择项目时,它会引发以下异常。

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

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

【问题讨论】:

  • 这很有趣,如果我关闭 EnableRowVirtualization 它可以正常工作,但是打开它就不行了。我知道这个错误是什么意思,但不明白为什么它会在行虚拟化时发生,或者提示修复它。
  • 我敢打赌,启用虚拟化后,您尝试与之交互的某些对象有时实际上并不存在。在 WPF 中,直接与任何单元格或行对象进行交互绝不是一个好主意。如果你只与m_dt.DefaultView 中的东西交互,而让网格担心显示它,你应该没问题。
  • 这很有帮助,我会试试的。谢谢
  • 好吧,除非它有帮助,否则不要称它有帮助。

标签: wpf vb.net datagrid


【解决方案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 返回一个实现IEnumerableDataView。枚举它,它会为您提供DataRowView 实例。这些就是DataGridSelectedItems 中为您提供的内容。

但我对DataTable 的了解几乎为零。如果您以其他方式做到了,如果有其他方式,您可能会得到其他东西。所以在那个循环中放一个断点并检查item;看看它是什么类型。它将代表您的数据行之一,否则我会吃掉我的帽子(1)。

(1) 这是一个独占 OR。

【讨论】:

  • 必须改变一些东西才能让它工作,我假设它来自转换器......无论如何,这太棒了,而且它有效!谢谢你帮助我理解。我简直不敢相信这是多么容易:(
  • 一旦你学会了 WPF,事情就会变得非常简单。不过也不容易学。你改变了什么?如果能包含工作版本就更好了
  • 我已经用答案编辑了我的问题,因为在评论中发布太长了。一旦你修好你的,我会删除它。
猜你喜欢
  • 1970-01-01
  • 2020-10-09
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
相关资源
最近更新 更多