I am developing a WinForms UI with two DateTimePicker
controls. Initially I want to set the value of the controls to null until a user selects a date. If the us
I know this is an older post, but others might still find this useful. It is fairly elegant and concise. I used this with a .Net 4.0 DateTimePicker but earlier versions should work with minimal tweaking. It leverages MinDate and 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;
To display the null value in DateTimePicker
control, Make the following changes in the Designer.cs
file:
this.DateTimePicker.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
this.DateTimePicker.CustomFormat = " ";
When user selects a date, code-in the ValueChanged
property of the control and make the format according to your needs. This will display the date in the control.
The above one only display's the control as blank in UI, however the default value will still be the current date.
If you want to set/initialize the value as null or empty string:
temp = DateTimePicker.CustomFormat.ToString();
This is the easiest workaround I found.
I think the best solution is to use the build-in checkbox that tell the user if a value is specified or not.
Set the control property ShowCheckBox = true
When you bind the value to it do something like
if (value == DateTime.MinValue) {
datePicker.Checked = false;
} else {
datePicker.Checked = true;
datePicker.Value = value;
}
When reading back the value check the Checked
property.
If you don't like the displayed value when it's unchecked, you can combine that with the other 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.
}
I hope this should help you Link1 To display blank in the picker field
and this too Link2
dateTimePicker1.CustomFormat = " ";
This is the code of a nullable datetime picker that I use:
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