我有一个DataGridView绑定到一个名为“BaseChange”的对象列表。 BaseChange对象由4个属性组成......
datagridview包含所有4个值的列以及第5个(名为“colIsSelected”的复选框列)。将列表绑定到网格并显示项目没有问题。
问题是,当启用了option strict时,获取网格中所选项的查询会给我一个隐式转换错误。
这是查询...
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时使用它。我在这里错过了什么吗?有人有建议吗?
答案 0 :(得分: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,因此您的行是一个对象。底部的解释更详细。
添加了:
添加选项推断应该简化这一点。
有关详情,请参阅:
What is the best way to mix VB.NET's Option Strict and the new Option Infer directives?
和
说明: 我做了一些更深入的挖掘,为什么它不简单。 DataGridView的RowCollection实现了返回对象的旧IEnumberable接口,而较新的集合类型实现了Generic IEnumerable(Of T)接口,它直接返回类型,无需进行转换。
有关已实现的接口,请参阅msdn。