Set DateTimePicker value to be null

2019-01-11 19:48发布

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 user does not select a date, it will pass a value of null to the database.

By default it takes the current date.

Could you plz suggest something or attach a piece of code which will help me out.

I have tried setting the MinDate property but it doesn't work.

The code is in C# .Net.

Thanks, Manali.

8条回答
ゆ 、 Hurt°
2楼-- · 2019-01-11 20:08

I hope this should help you Link1 To display blank in the picker field

and this too Link2

查看更多
成全新的幸福
3楼-- · 2019-01-11 20:08
dateTimePicker1.CustomFormat = " ";
查看更多
Luminary・发光体
4楼-- · 2019-01-11 20:11

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; 
查看更多
Luminary・发光体
5楼-- · 2019-01-11 20:20

May be you need to create a UserControl withe the Appereance of a TextBox,and when the user click on a Calender Show, when you select a Date set it to the TextBox. It will allow nulls values.

The DateTimePicker does not allow null.

查看更多
我想做一个坏孩纸
6楼-- · 2019-01-11 20:21

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
查看更多
冷血范
7楼-- · 2019-01-11 20:24

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.
  }
查看更多
登录 后发表回答