我有一个绑定名为“BaseChange”对象列表一个DataGridView。 该BaseChange对象是由4个属性...
- 一changeType
- ChangeStatus
- ChangeDescription
- LastChangeDate
DataGridView中对所有4个值以及列第五(称为“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作为的DataGridViewRow”代码,以及完整的消息是“ 从‘对象’到‘System.Windows.Forms.DataGridViewRow’隐式转换 ”。
如果我排除“作为的DataGridViewRow”从查询,我得到了_row.Cells和_row.DataBoundItem后期绑定错误,这也失败选项严格。
我需要这与选项严格启用工作,并在VB。 我失去了一些东西在这里? 任何人有任何建议吗?
(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的看到你的行()集合为IEnumerable,所以你行的对象。 说明在底部进入更多细节。
添加:
添加选项推断应该简化这个。
详情参见:
什么是混合VB.NET的选项严格和新的选项推断指令的最佳方式?
和
http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/e3ec737a-42f8-4767-a190-78390202a991/
说明:我做了一些更多的挖掘,为什么它不是简单的。 RowCollection对于一个DataGridView实现老IEnumberable界面返回的对象,而较新的集合类型实现了通用的IEnumerable(Of T)已界面,直接返回类型,消除了对铸件的需求。
请参阅MSDN的实现的接口。
文章来源: Linq query has an implicit cast error for DataGridViewRow when option strict is enabled