将DateTimePicker绑定到数据类型为time(0)的DB列

时间:2013-11-11 07:48:06

标签: sql-server vb.net winforms data-binding entity-framework-4

我有一个SQL Server表,我正在尝试将控件绑定到此表的相应列(我正在使用EF4)。其中一列是数据类型time(0),它绑定到DateTimePicker控件。

选择器的自定义格式为HH:mm。它还应该处理数据库表中的NULL值,因此我添加了自定义FormatParse事件处理程序。 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,但无济于事。

0 个答案:

没有答案