0

私は私を狂わせている問題を抱えています、そしてそれが私が愚かであるだけではないかどうかはわかりません

ブール列を追加するデータテーブルがあります

  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)

次に、それを繰り返し処理して、列に真の値ビットがあるかどうかを確認します。式のConvert.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
4

2 に答える 2

2

それはあなたの問題がどこにあるかではありません。Ifあなたの問題は声明の冒頭にあります。インデクサーによって返されるタイプは、です。これにはプロパティまたはフィールドObjectがありません。valueあなたは本当にこれを言いたいだけです:

If dr("Select") IsNot Nothing ...

DBNullただし、NULLはインスタンスによって表されるため、この条件がfalseになることはありません。代わりに、次の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

多分それはあまりにも賢いです、しかしそれは仕事を成し遂げます。

于 2013-03-10T22:24:34.313 に答える
2

ADataRowまたはプロパティ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

上記のようにnull許容型もサポートします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
于 2013-03-10T22:27:20.477 に答える