0

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

选择器的自定义格式为HH:mm. 它还应该处理NULLDB 表中的值,因此我添加了自定义FormatParse事件处理程序。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.Valueinsidedtp_Format方法是 typeTimeSpane.Valueinsidedtp_Parse是 type DateTime。也许这是导致问题的原因?我尝试在代码中使用TimeSpaninside of但无济于事。DateTimedtp_Parse

4

0 回答 0