类型'Boolean'上的公共成员'value'未找到vb.net datatable

时间:2013-03-10 22:21:23

标签: .net vb.net datatable boolean

我遇到一个让我疯狂的问题,我不确定这不是我的愚蠢

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

  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

2 个答案:

答案 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)

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