如何以编程方式关闭DateTimePicker的日历

时间:2015-01-22 14:59:28

标签: c# winforms visual-studio-2013

我正在使用一个使用大量DateTimePicker控件的Windows窗体。 根据规范,控制器需要显示没有日期'最初直到用户手动选择日期。

根据DateTimePicker功能,我们无法分配“没有”'作为一种价值。 因此,我们所做的是设置默认的最小日期,然后将控件的自定义格式更改为"",以给出空字段的错觉。

我们发现的一个怪癖是当用户点击DateTimePicker并第一次选择一个新日期时,他的初始点击不会解除日历。因此,日历仍然存在,用户必须在控件外部手动单击以关闭日历。

为了使用户体验稍微恶化,在此状态下,日历不受任何进一步日期选择的影响。因此,日期选择与最初选择的日期相关,用户需要点击。

控件选择日期后,选择新日期将按预期解除日历。

我最好的猜测是它会与原来的自定义格式有关,当选择了一个新的格式正确的日期时,会导致对控件的打嗝。

我正在努力找到一种“强迫”的方法。如果价值变化开放,日历将被解雇,但我找不到这样做的方法。 我甚至试图将重点放在价值变化的其他地方,但也没有运气。

有没有其他人经历过这种行为和/或知道解决方法? 谢谢!

部分代码-----------

//if dateTime property has not been saved, then call ClearDateTime on the controller, else display the saved value.

public static void ClearDateTime(DateTimePicker dtp)
    {
        dtp.Value = DateTime.Today.AddDays(-1);
        //set the format
        dtp.Format = System.Windows.Forms.DateTimePickerFormat.Custom;

        // set custom format to empty
        dtp.CustomFormat = " " ;
    }

// When value is changed/date is selected
private void DateTimePicker_ValueChanged(object sender, EventArgs e)
    {
        MainFormUtilities.ShowDateTime(this.DateTimePicker);
        this.LockFormDown();
    }

public static void ShowDateTime(DateTimePicker dtp)
    {
        dtp.Format = System.Windows.Forms.DateTimePickerFormat.Long;
    }

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我有类似的情况,客户坚持让字段显示没有日期(显示为空白)。我放弃了尝试破解标准.NET DateTimePicker并使用DevExpress DateEdit控件,该控件允许空值。

答案 2 :(得分:0)

我所追求的解决方案对于我的项目来说最实用的是Reniuz的建议,即使用复选框来控制DateTimePicker的值和行为。 如果用户想要添加日期,他会选中启用选择器的复选框,并默认为今天的日期。 如果他想清除日期(即毕竟不提交日期),则取消选中以空格式清除选择器的复选框,我们不会向数据库保存任何内容。

如果我有分数,我会提出所有其他建议。他们很有帮助,但这个解决方案似乎是我们的实际道路。再次感谢所有人!