1

我有一个绑定到名为“BaseChange”的对象列表的 DataGridView。BaseChange 对象由 4 个属性组成...

  • 更改类型
  • 更改状态
  • 变更说明
  • 上次更改日期

datagridview 包含所有 4 个值的列以及第 5 个值(称为“colIsSelected”的复选框列)。将列表绑定到网格并显示项目没有问题。

问题是,在启用选项严格时,获取网格中选定项目的查询给了我一个隐式转换错误。

这是查询...

Dim _changes As List(Of BaseChange)

_changes = (From _row As DataGridViewRow In dgvChanges.Rows() _
            Where Convert.ToBoolean(_row.Cells(NAME_COLUMN_IS_SELECTED).Value) = True _
            Select DirectCast(_row.DataBoundItem, BaseChange)).ToList()

...并且它会在选项严格关闭的情况下产生正确的结果。隐式转换曲线在“_row As DataGridViewRow”代码上,完整消息是“从 'Object' 到 'System.Windows.Forms.DataGridViewRow' 的隐式转换”。

如果我从查询中排除“As DataGridViewRow”,我会在 _row.Cells 和 _row.DataBoundItem 上收到后期绑定错误,这也会导致选项严格失败。

我需要它来启用 Option Strict 并在 VB 中工作。我在这里错过了什么吗?有人有建议吗?

4

1 回答 1

3
(From _row As DataGridViewRow In dgvChanges.Rows() 

您的 _row 对象类型必须与集合类型的单一版本匹配。

如:

    'Assumes Option Strict On and Option Implicit On
    Dim _changes = (From _row In dgvChanges.Rows() _            
           Where Convert.ToBoolean(ctype(_row,DataGridViewRow).Cells(NAME_COLUMN_IS_SELECTED).Value) = True _           
Select DirectCast(ctype(_row,DataGridViewRow).DataBoundItem, BaseChange)).ToList()

Linq 将您的 Rows() 集合视为 IEnumerable,因此您的行是一个对象。底部的解释更详细。

添加:

添加选项推断应该简化这一点。

更多详情见:

混合 VB.NET 的 Option Strict 和新的 Option Infer 指令的最佳方式是什么?

http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/e3ec737a-42f8-4767-a190-78390202a991/

解释:我做了更多的挖掘,为什么它不简单。DataGridView 的 RowCollection 实现了返回对象的较旧的 IEnumberable 接口,而较新的集合类型实现了直接返回类型的通用 IEnumerable(Of T) 接口,无需进行强制转换。

有关已实现的接口,请参见msdn 。

于 2009-07-06T20:51:12.617 回答