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