开发者

How to set win forms datetime picker to have no default value?

开发者 https://www.devze.com 2022-12-18 12:13 出处:网络
I am implementing search functionality in WinForms and I search by date range. Thus there are dateForm and dateTo date pickers on the form. By default their values are date time now() and if user do n

I am implementing search functionality in WinForms and I search by date range. Thus there are dateForm and dateTo date pickers on the form. By default their values are date time now() and if user do not touch date time pickers at all he will not get any results. Because search will be performed between now() and now(), also if I put min and max values as default it would solve first problem but there would be another problem if user wants to search by date range, he would need to click many times to come from default 1700 (something) to now()

Any suggestions to solve 开发者_运维问答this problem?

Thanks a lot.


You can't have a valueless datepicker with the out-of-the-box control. Why? It is backed by DateTime, which is non-nullable.

You can disable it with another control, or leave it disabled until the user clicks (bad UX for keyboard enthusiasts, like myself), or find or create (!) one that uses Nullable<DateTime>.

Edit:

In response to your comment, yes, you can do this; in fact, I've done it.

  • use fields or private properties to hold the 'from' and 'to' dates, instead of reading them from the dtp, and set their defaults to min and max
  • use a boolean flag to indicate when you are manipulating the dtp value in code, and in the dtp's ValueChanged event, set the flag's value to false
  • in the form load event, set the flag to true and dtp value to today's date
  • also in the ValueChanged event, set the from and to fields to the values of the dtps (you have to set both when either dtp changes, because the user will see the other one as set to today, but the search value will still be min or max).

The problems with this is that once the user has changed the date selection, she can't easily go back to "all dates." Furthermore, the user can't select "today only" without first changing one of the dates and then changing it back.

I think the best solution for you is to have a checkbox, "search by date range," which either enables the two dtps that are otherwise disabled, or displays the dtps that are otherwise hidden. Then you search from min to max unless the checkbox is checked, and when the checkbox is checked, you use the two dtp dates no matter what they are. Don't forget to deal with to and from being out of order, which can be done in several ways.


Have a look here for a nullable datetimepicker on CodeProject, in fact there are a few here.


Put a check box next to each datetime picker, and use the check box to enable/disable the datetime picker.

So if the datetimepicker is disabled, you know the user do not want to specify the datetime.


You can set DateDateTimePicker.Format property to Custom.

Then set DateDateTimePicker.CustomFormat property to your default text (e.g "N/A" or a space " ")

After the user has selected a certain date value, you should set back the format property to short etc.

How to set win forms datetime picker to have no default value?

Hope this helps!


The DateTimePicker has a ShowCheckBox property that "Determines whether a check box is displayed in the control. When the box is unchecked, no value is selected."

I've used something like the following for date range selectors that can be empty. One user told me that at first, she didn't know what the check box was for, but she figured it out on her own after using it a couple of times.

public DateTime? EndDate
{
    get
    {
        DateTime? returnValue = null;
        if (endDateDateTimePicker.Checked) 
        { 
            returnValue = endDateDateTimePicker.Value; 
        }
        return returnValue;
    }
    set
    {
        if (value.HasValue)
        {
            endDateDateTimePicker.Checked = true;
            endDateDateTimePicker.Value = value.Value;
        }
        else
        {
            endDateDateTimePicker.Checked = false;
        }
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号