c# 中日期选择器验证的正确方法? (窗口形式)

Posted

技术标签:

【中文标题】c# 中日期选择器验证的正确方法? (窗口形式)【英文标题】:Proper way for datepickers validaton in c#? (windows forms) 【发布时间】:2018-06-19 13:14:34 【问题描述】:

只是无法通过datepicker 验证获得它。 我有datepicker Fromdatepicker To,所以我想阻止用户做一些功夫并设置datepicker From > 要大于datepicker ,我遇到了一些questions 但找不到答案,所以我尝试了我能想到的最简单的方法: p>

form_load 事件中为datepicker from 设置MaxDate 属性

private void Form1_Load(object sender, EventArgs e)

     datepickerFrom.MaxDate = datepickerFrom.Value;

然后对value_changed事件做同样的事情

private void datepickerFrom_ValueChanged(object sender, EventArgs e)

    datepickerFrom.MaxDate = datepickerFrom.Value;

这很简单,只需几行代码,我只需要datepickerFrom_ValueChanged 事件,但最近我尝试将日期输入datepicker insted 中选择它,然后一切都崩溃了。 所以我找到了一些验证解决方案,而不是设置MaxDate属性,我已经尝试过了。

private void dtFrom_ValueChanged(object sender, EventArgs e)
        
    DateTime from = datepickerFrom.Value;
    DateTime to = datepickerTo.Value;
    int year= from.Year > to.Year ? to.Year : from.Year;
    int month = from.Month > to.Month ? to.Month : from.Month;
    int day = from.Day > to.Day ? to.Day : from.Day;
    int hour = from.Hour > to.Hour ? to.Hour : from.Hour;
    int minute = from.Minute > to.Minute ? to.Minute : from.Minute;
    int second = from.Second > to.Second ? to.Second : from.Second;
    //setting datepicker value
    datepickerFrom.Value = new DateTime(year, month, day, hour, minute, second);


这很好用,但感觉有点头疼,我也必须为datepickerTO_ValueChanged 事件做这个,当然我可以做一个method 并调用它两次,但仍然觉得有一种击球方式为此,有什么建议吗?

感谢您的宝贵时间

【问题讨论】:

我错过了什么吗?你不能只检查 From 是否大于 To 吗? 因此,您的实际问题描述源自您的描述“所有地狱都崩溃了”,类似于 “在 WinForms DatePicker 中输入日期时,它会忽略 MaxDate 属性” ? 【参考方案1】:

解决方案 1:

您可以处理 datePickerTo 关闭事件并执行以下操作:

private void dateTimePickerTo_CloseUp(object sender, EventArgs e)

    DateTime fromdate = Convert.ToDateTime(dateTimePickerFrom.Value);
    DateTime todate1 = Convert.ToDateTime(dateTimePickerTo.Value);
    if (fromdate > todate1)
        //Error

您也可以使用DateTime.Compare 获得两个日期 喜欢

int result = DateTime.Compar(dateTimePickerFrom.Value ,dateTimePickerTo.Value);

如果result1 意味着From 日期更早,see this link。

注意1:

但正如您所说,如果用户输入 From 或 To 文本框,则 closeup 事件永远不会触发,因此您需要在要处理的位置比较它们 比如按钮点击。

注意2:

如果值为DateTime,则作为@Sinatr 注释,则不需要转换它,因此代码如下:

 if (dateTimePickerFrom.Value >dateTimePickerTo.Value)
        //Error

【讨论】:

为什么不使用Value 属性?那你就不用Convert了。 @Sinatr,在看到您的评论之前已编辑,谢谢。 不错的建议,但是您建议将这行代码放在哪里?我应该把它放在datepickerTo_ValueChanged 事件中吗?尝试输入日期而不是选择时可能会导致一些问题,让我试试吧 @Yollo 正如我所提到的,将我建议的代码放在To datepicker 的CloseUp 事件中,或者在一个方法中并在用户输入日期完全不是change 事件时调用它。 @Yollo,关注 Note1,为什么你坚持要在 texboxes 事件中检查日期?在单独的方法中检查它们并在您想要的任何地方调用该方法不是更好吗,例如按钮单击(主进程)。【参考方案2】:

你的提议会导致一个糟糕的界面。假设以下情况:

From = 1 jan 2000
To = 1 feb 2000

用户希望将两个值都更改为 2010。他从起始值开始:

From = 1 jan 2010

现在他想将 TO 值更改为 2010 年 2 月 1 日。唉,他不能。

正确的用法是:添加一些按钮,操作员可以使用该按钮确认他已更改所有数据,开始检查并更新。在 Windows 中,此按钮通常命名为 Apply NowOK。为什么要偏离这个 windows 标准。

private void OnFormLoading(object sender, ...)

    this.FromDate.MinValue = ... // use the real absolute min value you want ever to allow
    this.FromDate.MaxValue = ...;
    this.ToDate.MinValue = ...;
    this.ToDate.MaxValue = ...;

只要操作员进行更改,就不要进行任何检查。当 Strat 指示他完成更改时检查输入值:

private void OnButtonApplyNow_Clicked(object sender, ...)

    bool InputOk = CheckInput();
    if (!inputOk)
    
         ShowIncorrectInput(); // for instance using a MessageBox
    

【讨论】:

感谢您的指点和建议,只是我正在以大型形式实现这一点,所以我想在value_changed event 中削减验证,_close_leave 事件会是和现在应用按钮一样吗? 因此,在包含两个日期的组框中添加一个 apply-now。如果名称令人困惑,请使用“接受”之类的内容

以上是关于c# 中日期选择器验证的正确方法? (窗口形式)的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript:日期选择器组件的使用

角度材料日期选择器中的日期不正确

在 Laravel 请求中验证 Bootstrap 日期时间选择器

C# 怎样把 DateTime.Now.Ticks转换为常规日期的形式

AngularJS - 出现在模态后面的日期选择器

jquery 日历/日期选择器