web-dev-qa-db-fra.com

Définissez la valeur DateTimePicker sur null

Je développe une interface utilisateur WinForms avec deux contrôles DateTimePicker. Initialement, je souhaite définir la valeur des contrôles sur null jusqu'à ce qu'un utilisateur sélectionne une date. Si l'utilisateur ne sélectionne pas de date, il passera une valeur null à la base de données. 

Par défaut, il prend la date du jour.

Pourriez-vous suggérer quelque chose ou joindre un morceau de code qui va m'aider. 

J'ai essayé de définir la propriété MinDate mais cela ne fonctionne pas.

Le code est en C # .Net.

Merci, Manali. 

10
Manali

Je pense que la meilleure solution consiste à utiliser la case à cocher intégrée qui indique à l'utilisateur si une valeur est spécifiée ou non.

Définir la propriété de contrôle ShowCheckBox = true

Lorsque vous liez la valeur, faites quelque chose comme

 if (value == DateTime.MinValue) {
    datePicker.Checked = false;
  } else {
    datePicker.Checked = true;
    datePicker.Value = value;
  }

Lors de la relecture de la valeur, vérifiez la propriété Checked.

Si vous n'aimez pas la valeur affichée lorsqu'elle n'est pas cochée, vous pouvez combiner cela avec les autres suggestions.

  if (!datePicker.Checked) {
    // hide date value since it's not set
    datePicker.CustomFormat = " ";
    datePicker.Format = DateTimePickerFormat.Custom;
  } else {
    datePicker.CustomFormat = null;
    datePicker.Format = DateTimePickerFormat.Long; // set the date format you want.
  }
14
Zyo

Je sais que c'est un article plus ancien, mais d'autres pourraient toujours trouver cela utile. C'est assez élégant et concis. J'ai utilisé cela avec un DateTimePicker .NET 4.0, mais les versions antérieures devraient fonctionner avec un minimum de peaufinage. Il exploite MinDate et Checked.

    // Use ValueChanged to decide if the value should be displayed:
    dateTimePicker1.ValueChanged += (s, e) => { dateTimePicker1.CustomFormat = (dateTimePicker1.Checked && dateTimePicker1.Value != dateTimePicker1.MinDate) ? "MM/dd/yyyy" : " "; };

    //When getting the value back out, use something like the following:
    DateTime? dt = (dateTimePicker1.Checked && dateTimePicker1.Value != dateTimePicker1.MinDate) ?  (DateTime?) dateTimePicker1.Value : null; 
    // or
    DateTime dt2 = (dateTimePicker1.Checked && dateTimePicker1.Value != dateTimePicker1.MinDate) ?  dateTimePicker1.Value : DateTime.MinValue; 
8
K Kimble

Pour afficher la valeur null dans le contrôle DateTimePicker, apportez les modifications suivantes au fichier Designer.cs:

this.DateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
this.DateTimePicker.CustomFormat = " ";

Lorsque l'utilisateur sélectionne une date, saisissez la propriété ValueChanged du contrôle et indiquez le format correspondant à vos besoins. Cela affichera la date dans le contrôle.

Le précédent indique uniquement que le contrôle est vide dans l'interface utilisateur, mais la valeur par défaut sera toujours la date actuelle.

Si vous souhaitez définir/initialiser la valeur en tant que chaîne nulle ou vide:

  1. déclarer une variable de chaîne temporaire, par exemple temp
  2. temp = DateTimePicker.CustomFormat.ToString();
  3. vérifie si temp est une chaîne vide. Si c'est le cas, à votre guise.

C'est la solution de contournement la plus simple que j'ai trouvée.

2
Manali

Supposons que dtpStartDate soit votre contrôle DateTimePicker.

Écrivez ce code dans Page_Load-

`dtpStartDate.Format = DateTimePickerFormat.Custom;
            dtpStartDate.CustomFormat = " ";`

Ecrivez ce code dans Value_Changed event-

`startDate = Convert.ToString(dtpStartDate.Value);
        dtpStartDate.Format = DateTimePickerFormat.Short;`

ici sélectionné 'court' comme Format. Vous pouvez sélectionner «Long» et une autre option disponible. 

2
Bhaskar Jain

J'espère que cela devrait vous aider Link1Pour afficher un blanc dans le champ du sélecteur

et cela aussi Link2

1
V4Vendetta

Peut-être devrez-vous créer un UserControl avec l’apparence d’un TextBox, et lorsque l’utilisateur clique sur un diaporama, lorsque vous sélectionnez une date, définissez-le sur la TextBox. Cela autorisera les valeurs NULL.

Le DateTimePicker n'autorise pas la valeur null.

1
JTorrecilla

Voici le code d'un sélecteur de date/heure nullable que j'utilise:

    Public Class DateTimePickerNullable
    Inherits DateTimePicker

    Public Shadows Event GotFocus(sender As Object, e As EventArgs)
    Public Shadows Event LostFocus(sender As Object, e As EventArgs)

    Private fvalue As DateTime?
    Private NoValueChange As Boolean = False
    Public Shadows Property Value As DateTime?
        Get
            Return fvalue
        End Get
        Set(value As DateTime?)
            fvalue = value
            If fvalue Is Nothing Then
                Me.Format = DateTimePickerFormat.Custom
                Me.CustomFormat = Space(Now.ToShortDateString.Length)
                NoValueChange = True
                MyBase.Value = Now
                NoValueChange = False
            Else
                Me.Format = DateTimePickerFormat.Short
                NoValueChange = True
                MyBase.Value = value.Value
                NoValueChange = False
            End If
        End Set
    End Property

    Protected Overrides Sub OnValueChanged(eventargs As EventArgs)
        If Not NoValueChange Then
            Value = MyBase.Value
        End If
        MyBase.OnValueChanged(eventargs)
    End Sub

    Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
        If e.KeyCode = Keys.Delete Then
            Value = Nothing
        End If
        If Me.Format = DateTimePickerFormat.Custom Then
            Try
                If Char.IsNumber(ChrW(e.KeyCode)) Then
                    If Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern.ToLower.StartsWith("m") Then
                        Value = New Date(Now.Year, CInt(ChrW(e.KeyCode).ToString), Now.Day)
                    Else
                        Value = New Date(Now.Year, Now.Month, CInt(ChrW(e.KeyCode).ToString))
                    End If
                    SendKeys.Send(ChrW(e.KeyCode))
                    Exit Sub
                End If
            Catch
            End Try
        End If
        MyBase.OnKeyDown(e)
    End Sub

    Private HasFocus As Boolean = False
    Protected Overrides Sub OnGotFocus(e As EventArgs)
        MyBase.OnGotFocus(e)
        If Not HasFocus Then
            HasFocus = True
            RaiseEvent GotFocus(Me, New EventArgs)
        End If
    End Sub

    Protected Overrides Sub OnValidated(e As EventArgs)
        MyBase.OnValidated(e)
        HasFocus = False
        RaiseEvent LostFocus(Me, New EventArgs)
    End Sub
End Class
0
Theo Verweij