我遇到一个让我疯狂的问题,我不确定这不是我的愚蠢
我有一个数据表,我在其中添加一个布尔列
ds.Tables(0).Columns.Add(New DataColumn("Select", System.Type.GetType("System.Boolean")))
ds.Tables(0).Columns("Select").ReadOnly = False
ds.Tables(0).Columns("Select").DefaultValue = False
ds.Tables(0).Columns("Select").SetOrdinal(0)
然后我遍历它并检查列是否有一个真值位我在表达式
For Each dr As DataRow In Categories.Tables(0).Rows
If dr("Select").value IsNot Nothing AndAlso (Not IsDBNull(dr("Select").value)) AndAlso Convert.ToBoolean(dr("Select")) = True Then
'Do Something
End If
Next
答案 0 :(得分:2)
这不是你的问题所在。您的问题出现在If
语句的开头。索引器返回的类型是Object
,它没有value
属性或字段。你真的只想这样说:
If dr("Select") IsNot Nothing ...
但是这种情况永远不会是错误的,因为NULL由DBNull
个实例表示。相反,请使用此If
语句:
If Not dr.IsNull("Select") AndAlso Convert.ToBoolean(dr("Select")) Then
要成为更多VB,你也可以这样做
If Not dr.IsNull("Select") AndAlso CBool(dr("Select")) Then
而且,对于Tim的回答借款人,您可以使用Field()
扩展方法(参见:http://msdn.microsoft.com/en-us/library/system.data.datarow.field(v=vs.90).aspx),如下所示:
If If(dr.Field(Of Boolean?)("Select"), False) Then
也许这太聪明了,但它完成了工作。
答案 1 :(得分:2)
DataRow
或Object
没有value
属性。
使用强类型Field
扩展方法代替:
For Each dr As DataRow In Categories.Tables(0).Rows
Dim isSelected As Boolean? = dr.Field(Of Boolean?)("Select")
If isSelected.HasValue AndAlso isSelected Then
'Do Something
End If
Next
它还支持可空类型,如上面的Nullable(Of Boolean)
。
如果你低于.NET 3.5,你必须手动投射:
For Each dr As DataRow In Categories.Tables(0).Rows
If Not dr.IsNull("Select") AndAlso DirectCast(dr("Select"), Boolean) Then
'Do Something
End If
Next