偶然发现了你的帖子。我不确定这是否是 FormatException,但我也遇到了带有数据绑定 DateTimePicker 的异常。
问题是
DateTimePicker.MinimumDateTime = #1/1/1753#
尽管
DateTime.MinValue = #1/1/0001#
New DateTime = #1/1#0001#
因此,如果将属性绑定到返回早于 #1/1/1753# 或晚于 #12/31/9998# ( DateTimePicker.MaximumDateTime ) 的 DateTime 值的 DataGridView ,则会出现异常。
我用自己继承的 DateTimePicker 解决了这个问题(抱歉,它是用 vb 编写的)
要使用它,您只需将 Subsonic 对象绑定到 value 属性。但是您必须将 ShowCheckBox 属性设置为 true 并将 bool 值绑定到 CheckedValue 属性(以指示日期已设置),该属性也保留在您的数据库中。
Now 如果返回一个空日期,则日期设置为 Now,checkedValue 设置为 false,导致 DateTimePicker 被禁用。如果您选中复选框或使用日历选择日期)复选框将设置为 true 并选中复选框。
注意:不要直接绑定Checked属性,绑定CheckedValue属性。
Imports System.ComponentModel
Public Class MyDateTimePicker
Inherits System.Windows.Forms.DateTimePicker
<Bindable(True)> _
Public Overloads Property Value() As DateTime
Get
If Not MyBase.Checked And (MyBase.Value < DateTimePicker.MinimumDateTime Or MyBase.Value > DateTimePicker.MaximumDateTime) Then
Return DateTime.Now
Else
Return MyBase.Value
End If
End Get
Set(ByVal value As DateTime)
If ((value < DateTimePicker.MinimumDateTime Or value > DateTimePicker.MaximumDateTime) Or value = #1/1/1900#) Then
MyBase.Value = DateTime.Now
MyBase.Checked = False
Else
MyBase.Value = value
End If
End Set
End Property
Private _CheckedValue As Boolean
<Bindable(True)> _
Public Property CheckedValue() As Boolean
Get
Return _CheckedValue
End Get
Set(ByVal value As Boolean)
_CheckedValue = value
End Set
End Property
Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
MyBase.OnMouseUp(e)
RefreshCheckedValue()
End Sub
Protected Overrides Sub OnKeyUp(ByVal e As System.Windows.Forms.KeyEventArgs)
MyBase.OnKeyDown(e)
RefreshCheckedValue()
End Sub
Private Sub RefreshCheckedValue()
CheckedValue = Me.Checked
If Not Me.DataBindings("CheckedValue") Is Nothing Then
Me.DataBindings("CheckedValue").WriteValue()
End If
End Sub
Protected Overrides Sub OnBindingContextChanged(ByVal e As System.EventArgs)
MyBase.OnBindingContextChanged(e)
Static checkedInitialized As Boolean
If Not checkedInitialized AndAlso Not Me.DataBindings("CheckedValue") Is Nothing Then
Me.Checked = Me.CheckedValue
checkedInitialized = True
End If
End Sub
End Class