我有一个 SQL Server 表,我正在尝试将控件绑定到该表的相应列(我使用的是 EF4)。其中一列是time(0)
绑定到DateTimePicker
控件的数据类型。
选择器的自定义格式为HH:mm
. 它还应该处理NULL
DB 表中的值,因此我添加了自定义Format
和Parse
事件处理程序。DB 列绑定到选取器的Text
属性,选取器正确显示 DB 表中的时间值,包括NULL
值。(我尝试了该Value
属性,但选择器没有正确显示 DB 值)。
问题是当我这样做时context.SaveChanges()
,所有值都保存到数据库中,除了选择器值。我没有收到任何错误消息或类似的东西,所以我不明白为什么选择器无法保存其价值。仅更改选择器值似乎对数据库表没有任何影响。
任何帮助或建议将不胜感激。
这是我的代码:
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
更新
好的,我将选择器数据绑定更改为绑定到Value
属性而不是Text
,并更改了dtp_Format
代码以便选择器显示正确的值。
选择器验证似乎存在问题,这可能会阻止将选择器值保存到数据库中。如果我更改选择器值并尝试移动到另一个字段,Validating
则会触发事件但不会触发Validated
事件,焦点不会移动到下一个字段并且我无法关闭表单。如果我放入DateTime.TryParse(MyTimePicker.Value, tmp)
事件Validating
中并返回True
. 如果我设置CausesValidation = False
问题就消失了,但选择器值仍然没有保存到数据库中。
在调试过程中我还注意到e.Value
insidedtp_Format
方法是 typeTimeSpan
而e.Value
insidedtp_Parse
是 type DateTime
。也许这是导致问题的原因?我尝试在代码中使用TimeSpan
inside of但无济于事。DateTime
dtp_Parse