2013-03-10 62 views
0

我有被我逼疯一个问题,我不知道它只是不是我太傻了公共部件类型'值“布尔”未找到vb.net数据表

我有一个数据表,其中我添加了一个布尔列

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) 

我然后遍历它和检查,看看是否列有一个真正的价值一点我得到“的类型‘布尔’未找到公共成员‘价值’”的错误的转换.ToBoolean部分表达式

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 

回答

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 

而且,从蒂姆的回答借款人,您可以使用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 

也许这太聪明了,但它完成了工作。

2

A DataRowObject没有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 
+1

注意,只有.NET 3.5及以上支持'场()'扩展,这是我同意的,是一个相当不错的一个。 – siride 2013-03-10 22:30:39

+0

@siride:据此编辑我的答案。 – 2013-03-10 22:39:17