如何将winforms datetimepicker设置为没有默认值?

Posted

技术标签:

【中文标题】如何将winforms datetimepicker设置为没有默认值?【英文标题】:How to set win forms datetime picker to have no default value? 【发布时间】:2011-01-10 05:37:13 【问题描述】:

我正在 WinForms 中实现搜索功能,并按日期范围进行搜索。因此表单上有 dateForm 和 dateTo 日期选择器。默认情况下,它们的值是日期时间 now(),如果用户根本不触摸日期时间选择器,他将不会得到任何结果。因为搜索将在 now() 和 now() 之间执行,如果我将 min 和 max 值作为默认值,它将解决第一个问题,但如果用户想要按日期范围搜索,则会出现另一个问题,他需要单击许多从默认 1700(某物)到 now() 的时间

有解决这个问题的建议吗?

非常感谢。

【问题讨论】:

DateTimePicker Null Value (.NET)的可能重复 【参考方案1】:

您不能使用开箱即用的控件来使用无价值的日期选择器。为什么?它由不可为空的 DateTime 支持。

您可以使用另一个控件禁用它,或者在用户单击之前将其禁用(对于像我这样的键盘爱好者来说是糟糕的 UX),或者找到或创建(!)一个使用 Nullable<DateTime> 的控件。

编辑:

响应您的评论,是的,您可以这样做;事实上,我已经做到了。

使用字段或私有属性来保存“从”和“到”日期,而不是从 dtp 中读取它们,并将它们的默认值设置为 min 和 max 使用布尔标志来指示您何时在代码中操作 dtp 值,并在 dtp 的 ValueChanged 事件中,将该标志的值设置为 false 在表单加载事件中,将标志设置为 true 并将 dtp 值设置为今天的日期 同样在ValueChanged 事件中,将fromto 字段设置为dtps 的值(当任一dtp 更改时,您必须同时设置这两个字段,因为用户会看到另一个设置为今天,但搜索值仍将是最小值或最大值)。

这样做的问题是,一旦用户更改了日期选择,她就不能轻易返回到“所有日期”。此外,如果不先更改其中一个日期,然后再将其更改回来,用户就无法选择“仅限今天”。

我认为对您来说最好的解决方案是有一个复选框,“按日期范围搜索”,它可以启用两个否则禁用的 dtps,或者显示隐藏的 dtps。然后你从 min 到 max 搜索,除非复选框被选中,并且当复选框 is 被选中时,无论它们是什么,你都使用两个 dtp 日期。不要忘记处理tofrom 出现故障,这可以通过多种方式完成。

【讨论】:

有没有办法检查日期选择器值是否已更改?如果没有,请将 dateFrom 设置为最小日期时间,将 dateTo 设置为最大日期时间。否则,从 datepicker 中输入实际值。【参考方案2】:

在 CodeProject 上查看 here 的可空日期时间选择器,实际上有几个 here。

【讨论】:

谢谢汤姆,我会尽快查看链接,如果我不回复只是因为我很忙。对不起【参考方案3】:

在每个日期时间选择器旁边放置一个复选框,并使用该复选框启用/禁用日期时间选择器。

所以如果 datetimepicker 被禁用,你就知道用户不想指定 datetime。

【讨论】:

由于 UI 设计要求,我想我不能使用它【参考方案4】:

您可以将DateDateTimePicker.Format 属性设置为Custom

然后将DateDateTimePicker.CustomFormat 属性设置为您的默认文本(例如"N/A" 或空格" "

用户选择了某个日期值后,你应该将格式属性设置回短等。

希望这会有所帮助!

【讨论】:

【参考方案5】:

DateTimePicker 有一个 ShowCheckBox 属性,该属性“确定是否在控件中显示复选框。当未选中该框时,不会选择任何值。”

对于可以为空的日期范围选择器,我使用了类似以下的内容。一位用户告诉我,一开始她不知道这个复选框是干什么用的,但是她用了几次之后就自己弄明白了。

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;
        
    

【讨论】:

以上是关于如何将winforms datetimepicker设置为没有默认值?的主要内容,如果未能解决你的问题,请参考以下文章

winform中如何修改datetimepicker的时间值

WinForm时间选择控件(DateTimePicker)如何选择(显示)时分秒

为啥将 Winforms DateTimePicker 设置为 DateTime.MinValue 会失败?

DateTimePicker:选择日期和时间

c# winform的dateTimePicker控件的日历面板的字体怎么调大?

winform中的dateTimePicker控件怎么设置它的默认值为空?