DateTimePickerの値を使用するかどうかを確認するチェックボックスを使用して、UIに日付範囲フィルターを設定しようとしています。
Dim fromDate As DateTime? = If(fromDatePicker.Checked, fromDatePicker.Value, Nothing)
ただし、fromDate
をNothing
に設定しても、Nothing
に設定されますが、'12:00:00 AM 'に設定され、その後にIf
が設定されます。 startDate
はNothing
ではないため、ステートメントはフィルターを誤って実行します。
If (Not startDate Is Nothing) Then
list = list.Where(Function(i) i.InvDate.Value >= startDate.Value)
End If
startDate
がNothing
の値を取得するようにするにはどうすればよいですか?
問題は、最初にこの割り当ての右側を調べ、タイプがDateTime
(_?
_なし)であることを決定することです。次に、割り当てを実行します。
これは動作します:
_Dim fromDate As DateTime? = If(fromDatePicker.Checked, _
fromDatePicker.Value, _
CType(Nothing, DateTime?))
_
右側の型を強制的に_DateTime?
_にするためです。
私のコメントで述べたように、 Nothing
はnull
ではなく、C#のdefault(T)
に似ている場合があります。
Nothing
は、データ型のデフォルト値を表します。デフォルト値は、変数が値型であるか参照型であるかによって異なります。
VB.NETとEF 6.Xでnullを保存するには:
Dim nullableData As New Nullable(Of Date)
@Damien_The_Unbelieverのすばらしい答えに加えて、_New DateTime?
_の使用も機能します。
_Dim fromDate As DateTime? = If(fromDatePicker.Checked, _
fromDatePicker.Value, _
New DateTime?)
_
CType(Nothing, DateTime?)
が望ましいのはなぜか、直観に反しているように見えるかもしれません。
squery = "insert into tblTest values('" & Me.txtCode.Text & "', @Date)"
Dim cmd = New SqlCommand(squery, con)
cmd.Parameters.Add("@Date", SqlDbType.DateTime)
If txtRequireDate.Text = "" Then
cmd.Parameters("@Date").Value = DBNull.Value
Else
cmd.Parameters("@Date").Value = txtRequireDate.Text
End If
使用する New Date
マジックナンバーとして:
Dim fromDate As New Date
If fromDatePicker.Checked Then
fromDate = fromDatePicker.Value
End If
If fromDate <> New Date Then
list = list.Where(Function(i) i.InvDate.Value >= fromDate.Value)
End If