问题#1:最新工作版
我目前正在使用SubSonic 2.1内置的491。 以后有没有?我在哪里可以得到它? 我知道2.2已经发布但它没有安装程序,我不知道如何修改App.Config / Web.Config来使用它。
问题#2:Windows窗体上的dateTimePicker控件问题。
我一直试图System.FormatException
尝试从SubSonic检索数据到该控件,或者通过SubSonic将数据从该控件保存到数据库。
例如,如果我只想保存时间,我可以使用.Text属性。要保存日期,我需要使用控件的.Value属性。
我尝试了各种转换,例如Convert.ToDateTime(dateTimePicker.Value.ToString())
和其他转换,但我找不到一个不会引发异常的一致模式。对此的任何帮助将不胜感激。
答案 0 :(得分:0)
问题1 - 我认为SS2.1和2.2之间不需要更改app.config / web.config
对于问题2 - 您是否有机会使用MSSQL2008中的新数据类型?如果是这样,SS2.2似乎还没有正确处理它们。
答案 1 :(得分:0)
偶然发现了你的帖子。 我不确定它是否是一个FormatException,但我也得到了一个带有数据绑定DateTimePicker的异常。
问题在于
DateTimePicker.MinimumDateTime = #1/1/1753#
而
DateTime.MinValue = #1/1/0001#
New DateTime = #1/1#0001#
因此,如果将属性绑定到DataGridView,该DataGridView返回的日期时间值早于#1/1/1753#或之后的#12/31/9998#(DateTimePicker.MaximumDateTime),则会出现异常。
我用自己继承的DateTimePicker解决了这个问题(对不起,但用vb编写)
要使用它,您只需将Subsonic对象绑定到value属性即可。但是您必须将ShowCheckBox属性设置为true并将bool值绑定到CheckedValue属性(以指示日期已设置),该属性也会保留在数据库中。
现在如果返回空日期,则日期设置为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