我有一个DataGridView,它绑定到一个名为"BaseChange“的对象列表中。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()
...and,它产生正确的结果,选项严格关闭。隐式强制转换是在"_row As DataGridViewRow“代码上,完整的消息是”从'Object‘到’System.Windows.Forms.DataGridViewRow‘的隐式转换“。
如果我将"As DataGridViewRow“排除在查询之外,则会在_row.Cells和_row.DataBoundItem上得到一个后期绑定错误,这也会导致选项严格失败。
我需要这与选项严格启用,并在VB中工作。我是不是漏掉了什么?有人有建议吗?
发布于 2009-07-06 20:51:12
(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将您的row ()集合视为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。
https://stackoverflow.com/questions/1089059
复制相似问题