SubSonic和Windows窗体上的dateTimePicker控件

时间:2009-05-26 01:57:57

标签: version subsonic datetimepicker

问题#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())和其他转换,但我找不到一个不会引发异常的一致模式。对此的任何帮助将不胜感激。

2 个答案:

答案 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