0

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

4

2 回答 2

0

关于问题 1 - 我认为 SS2.1 和 2.2 之间不需要任何 app.config / web.config 更改

对于问题 2 - 您是否有机会使用 MSSQL2008 中的新数据类型?如果是这样,SS2.2 似乎还没有正确处理它们。

于 2009-05-26T11:36:17.010 回答
0

偶然发现了你的帖子。我不确定这是否是 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
于 2009-06-09T11:35:04.690 回答