如何使DateTimePicker显示空字符串?

76

我希望能够显示一个默认值为DateTimePicker, 也就是没有日期。

例如,我有一个任务的开始日期dtTaskStart和结束日期dtTaskEnd,但是结束日期是未知的,并且最初未填充。

我为两个控件指定了自定义格式yyyy-MM-dd

在运行时将值设置为null或空字符串会导致错误,那我该如何解决这个问题呢?

我考虑过使用复选框来控制此字段的启用,但仍存在显示初始值的问题...

编辑:
可以说这个问题是DateTimePicker Null Value (.NET)的重复, 但我发现我为我的问题找到的解决方法不适用于那个问题,因此我认为它应该保留在这里供其他人参考。


可能是DateTimePicker Null Value (.NET)的重复问题。 - bluish
8个回答

66

只需按如下设置属性:

当用户按下“清除按钮”或“删除键”时,请执行以下操作:

dtpData.CustomFormat = " "  'An empty SPACE
dtpData.Format = DateTimePickerFormat.Custom

DateTimePicker1_ValueChanged 事件中执行以下操作:

dtpData.CustomFormat = "dd/MM/yyyy hh:mm:ss"

1
@threeFourOneSixOneThree - 我认为这是最合适的,因此我没有评论的资格。 - Jon
还可以使用dtpData.Format = DateTimePickerFormat.Short(或其他格式)来设置,而不是使用dtpData.CustomFormat = "dd/MM/yyyy hh:mm:ss" - mbomb007
1
如果日期选择器打开后,所选日期是正确的,用户再次关闭它会怎样? - Ben
1
Ben所描述的问题正是我遇到的。如果值使用空白的“CustomFormat”隐藏,用户展开日历,所选日期已被选择,他们单击它以重新显示在DateTimePicker中,则“ValueChanged”事件不会触发(因为它实际上没有更改),因此空白自定义格式不会被删除。最终我使用了“CloseUp”事件而不是“ValueChanged”,这解决了这个问题,但意味着通过其按钮关闭日历,而不是单击日期,仍会将日期重新添加到字段中。并不理想... - Adam Dawes

28

使用CustomFormat属性混淆值,使用复选框cbEnableEndDate作为标志来指示其他代码是否应忽略该值:

If dateTaskEnd > Date.FromOADate(0) Then
    dtTaskEnd.Format = DateTimePickerFormat.Custom
    dtTaskEnd.CustomFormat = "yyyy-MM-dd"
    dtTaskEnd.Value = dateTaskEnd 
    dtTaskEnd.Enabled = True
    cbEnableEndDate.Checked = True
Else
    dtTaskEnd.Format = DateTimePickerFormat.Custom
    dtTaskEnd.CustomFormat = " "
    dtTaskEnd.Value = Date.FromOADate(0)
    dtTaskEnd.Enabled = False
    cbEnableEndDate.Checked = False
End If

1
巧妙/狡猾但有效。 :) - AR.

24

这对我在C#上起作用。

if (enableEndDateCheckBox.Checked == true)
{
    endDateDateTimePicker.Enabled = true;
    endDateDateTimePicker.Format = DateTimePickerFormat.Short;                
}
else
{
    endDateDateTimePicker.Enabled = false;
    endDateDateTimePicker.Format = DateTimePickerFormat.Custom;
    endDateDateTimePicker.CustomFormat = " ";
}

干得好,伙计们!


5

如果有人在表单加载事件中设置datetimepicker控件为空,并根据需要显示当前日期时遇到问题,这里是一个例子:

确保CustomFormat = " "在两种方法中有相同数量的空格(至少一个空格)

Private Sub setDateTimePickerBlank(ByVal dateTimePicker As DateTimePicker)    

    dateTimePicker.Visible = True
    dateTimePicker.Format = DateTimePickerFormat.Custom
    dateTimePicker.CustomFormat = "    " 
End Sub


Private Sub dateTimePicker_MouseHover(ByVal sender As Object, ByVal e As 
                    System.EventArgs) Handles dateTimePicker.MouseHover

    Dim dateTimePicker As DateTimePicker = CType(sender, DateTimePicker)
    If dateTimePicker.Text = "    " Then
        dateTimePicker.Text = Format(DateTime.Now, "MM/dd/yyyy")
    End If
End Sub

1
我认为你需要在这里稍微编辑一下格式。 - Polynomial
@Catherine 标准是变量名应以小写字母开头。更改为此可改善格式,因为这是 .NET 在 Stack Overflow 上的期望。 - mbomb007

4
当我想显示一个空日期值时,我会这样做:
            if (sStrDate != "")
            {
                dateCreated.Value = DateTime.Parse(sStrDate);
            }
            else
            {
                dateCreated.CustomFormat = " ";
                dateCreated.Format = DateTimePickerFormat.Custom;
            }

当用户点击控件时,我有以下代码:
            private void dateControl_MouseDown(object sender, MouseEventArgs e)
            {
                ((DateTimePicker)sender).Format = DateTimePickerFormat.Long;    
            }

这使您能够显示和使用空日期值,但仍然允许用户在需要时更改日期。

请记住,sStrDate已经被验证为有效的日期字符串。


4
基本概念与其他人讲述的相同,但当您有多个 dateTimePicker 时,采用此方法更容易实现。
dateTimePicker1.Value = DateTime.Now;
dateTimePicker1.ValueChanged += new System.EventHandler(this.Dtp_ValueChanged);
dateTimePicker1.ShowCheckBox=true;
dateTimePicker1.Checked=false;


dateTimePicker2.Value = DateTime.Now;
dateTimePicker2.ValueChanged += new System.EventHandler(this.Dtp_ValueChanged);
dateTimePicker2.ShowCheckBox=true;
dateTimePicker2.Checked=false;

值变更事件函数

        void Dtp_ValueChanged(object sender, EventArgs e)
        {
            if(((DateTimePicker)sender).ShowCheckBox==true)
            {
                if(((DateTimePicker)sender).Checked==false)
                {
                    ((DateTimePicker)sender).CustomFormat = " ";
                    ((DateTimePicker)sender).Format = DateTimePickerFormat.Custom;
                }
                else
                {
                    ((DateTimePicker)sender).Format = DateTimePickerFormat.Short;
                }
            }
            else
            {
                ((DateTimePicker)sender).Format = DateTimePickerFormat.Short;
            }
        }

未勾选时 enter image description here

已勾选时 enter image description here


1
这是问题的最佳解决方案。 - UncleFester
这个处理程序在基础数据源填充空值时不会触发,因为从技术上讲,dtp值没有改变。因此,对于那种情况来说,这是不好的。 - stigzler

2

听着,如果你想展示一个空的日期选择器并在用户未选择日期时获取null值,否则保存日期,请按照以下步骤更改代码:

  1. 将日期选择器的FORMAT属性设置为自定义。
  2. CUSTOM FORMAT属性设置为空字符串" "。
  3. 默认情况下将其TAG设置为0。
  4. 注册日期选择器的VALUECHANGED事件。

现在开始真正的工作

如果用户与日期选择器进行交互,则会调用其VALUECHANGED事件,并在那里将其TAG属性设置为1。

最后一步

现在,在保存时,检查它的TAG是否为零,如果是,则保存NULL日期,否则如果TAG为1,则选择并保存日期选择器的值。

它像魔法一样有效。

现在,如果您希望用户通过交互将其值更改回为空,请添加复选框并显示文本“清除”与此复选框。如果用户想要清除日期,只需再次将其CUSTOM FORMAT属性设置为空字符串" ",并将其TAG设置回0。就这样。


0
最好使用文本框来调用/显示日期,并在保存时使用DateTimePicker。 根据需要将可见属性设置为true或false。
例如:在窗体加载时,将日期加载到文本框中,并使DTPIcker不可见,在添加时相反。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接