SQL Server テーブルがあり、このテーブルの対応する列にコントロールをバインドしようとしています (EF4 を使用しています)。列の 1 つは、コントロールtime(0)
にバインドされているデータ型です。DateTimePicker
ピッカーのカスタム形式はHH:mm
. NULL
DB テーブルの値も処理する必要があるため、カスタム ハンドラーFormat
とParse
イベント ハンドラーを追加しました。DB 列はピッカーのText
プロパティにバインドされており、ピッカーは値を含む DB テーブルの時間値を正しく表示しNULL
ます。(プロパティを試しましたValue
が、ピッカーは DB 値を正しく表示しませんでした)。
問題は、私が行うcontext.SaveChanges()
と、ピッカー値を除いてすべての値がDBに保存されることです。エラー メッセージなどは表示されないため、ピッカーが値を保存できない理由がわかりません。ピッカー値のみを変更しても、DB テーブルには影響がないようです。
任意のヘルプや提案をいただければ幸いです。
これが私のコードです:
Private Sub MyScreen_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim b As Binding = MyTimePicker.DataBindings.Item("Value")
AddHandler b.Format, New ConvertEventHandler(AddressOf dtp_Format)
AddHandler b.Parse, New ConvertEventHandler(AddressOf dtp_Parse)
context = New MyDBEntities()
Me.ProductsBindingSource.DataSource = context.Products
End Sub
Private Sub dtp_Format(sender As Object, e As ConvertEventArgs)
Dim bnd As Binding = CType(sender, Binding)
If bnd IsNot Nothing Then
Dim dtp As DateTimePicker = CType(bnd.Control, DateTimePicker)
If dtp IsNot Nothing Then
If e.Value Is Nothing Then
dtp.Checked = False
e.Value = dtp.Value
Else
dtp.Checked = True
dtp.Value = dtp.Value.Date + e.Value
End If
End If
End If
End Sub
Private Sub dtp_Parse(sender As Object, e As ConvertEventArgs)
Dim bnd As Binding = CType(sender, Binding)
If bnd IsNot Nothing Then
Dim dtp As DateTimePicker = CType(bnd.Control, DateTimePicker)
If dtp IsNot Nothing Then
If Not dtp.Checked Then
dtp.ShowCheckBox = True
dtp.Checked = False
e.Value = DBNull.Value
Else
Dim val As DateTime = Convert.ToDateTime(e.Value)
e.Value = New Nullable(Of DateTime)(val)
End If
End If
End If
End Sub
アップデート
OK、ピッカーのデータ バインディングをValue
ではなくプロパティにバインドするように変更し、ピッカーが正しい値を表示するようText
にコードを変更しました。dtp_Format
ピッカーの検証に問題があるようで、ピッカーの値を DB に保存できない可能性があります。ピッカーの値を変更して別のフィールドに移動しようとすると、Validating
イベントは発生しますがイベントは発生Validated
せず、フォーカスは次のフィールドに移動せず、フォームを閉じることができません。イベントDateTime.TryParse(MyTimePicker.Value, tmp)
の中に入れると、 が返されます。私が設定した場合、問題はなくなりましたが、それでもピッカーの値は DB に保存されません。Validating
True
CausesValidation = False
また、デバッグ中に、e.Value
内部dtp_Format
のメソッドがタイプであるのTimeSpan
に対し、e.Value
内部dtp_Parse
はタイプであることに気付きましDateTime
た。多分それが問題の原因ですか?のコードTimeSpan
内で使用しようとしましたが、役に立ちませんでした。DateTime
dtp_Parse