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.
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.
}
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;
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:
temp = DateTimePicker.CustomFormat.ToString();
C'est la solution de contournement la plus simple que j'ai trouvée.
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.
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.
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