2009-05-26 7 views
0

Question n ° 1: Version de travail Dernièressubsonique et un contrôle DateTimePicker sur un formulaire Windows

J'utilise actuellement SubSonic 2.1 construit 491. Y at-il une version ultérieure? Où peux-je le recevoir? Je sais que la version 2.2 a été publiée, mais elle ne comporte pas de programme d'installation et je ne saurais pas comment modifier le fichier App.Config/Web.Config pour l'utiliser.

Question n ° 2: Problème avec le contrôle dateTimePicker sur Windows Form.

Je continue d'obtenir System.FormatException en essayant de récupérer des données De SubSonic à ce contrôle ou en enregistrant des données de ce contrôle à la base de données via SubSonic. Par exemple, si je veux enregistrer uniquement l'heure, je peux utiliser la propriété .Text. Pour enregistrer la date, j'ai besoin d'utiliser la propriété .Value du contrôle.

J'ai essayé toutes sortes de conversions telles que Convert.ToDateTime(dateTimePicker.Value.ToString()) et d'autres, mais je ne trouve pas de motif cohérent qui ne déclencherait pas d'exception. Toute aide à ce sujet serait grandement appréciée.

+0

salut, s'il vous plaît modifier le sujet de votre question et le rendre plus précis. – Rahul

Répondre

0

Re Question 1 - Je ne pense pas que tout changement app.config/web.config est nécessaire entre SS2.1 et 2,2

Pour la question 2 - utilisez-vous les nouveaux types de données dans MSSQL2008 par hasard ? Si c'est le cas, SS2.2 ne semble pas encore les gérer correctement.

0

Juste tombé sur votre poste. Je ne suis pas sûr si c'était une exception FormatException, mais j'ai aussi une exception avec une datetime DateTimePicker.

Le problème est que

DateTimePicker.MinimumDateTime = #1/1/1753# 

tout

DateTime.MinValue = #1/1/0001# 
New DateTime = #1/1#0001# 

Donc, si lier une propriété à un DataGridView qui retourne une valeur DateTime plus tôt que # 1/1/1753 # ou plus tard, puis # 12/31/9998 # (DateTimePicker.MaximumDateTime) vous obtenez une exception.

Je résolus de ma propre héritée DateTimePicker (désolé, mais il est écrit en vb)

Pour l'utiliser, vous pouvez simplement lier votre objet subsonique à la propriété de valeur. Mais vous devez définir la propriété ShowCheckBox sur true et lier une valeur bool à la propriété CheckedValue (pour indiquer que la date est définie) qui est également conservée dans votre base de données.

Maintenant Si une date vide est renvoyée, la date est définie sur Now et la valeur checkedValue sur false, ce qui entraîne la désactivation de DateTimePicker. Si vous cochez la case ou choisissez une date avec le calendrier), la case à cocher est définie sur true et la case à cocher est cochée.

Avertissement: Ne liez pas directement la propriété Vérifié, liez la propriété 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