【发布时间】:2008-11-12 15:48:16
【问题描述】:
更改 .NET DateTimePicker 控件以允许用户输入 null 值的最简单、最可靠的方法是什么?
【问题讨论】:
-
另一种选择是使用带有
00/00/0000掩码的 MaskedTextBox。这允许一些直观的数据输入,并且可能是用于退出日期字段的最直观的 UX。
标签: .net datetimepicker null
更改 .NET DateTimePicker 控件以允许用户输入 null 值的最简单、最可靠的方法是什么?
【问题讨论】:
00/00/0000 掩码的 MaskedTextBox。这允许一些直观的数据输入,并且可能是用于退出日期字段的最直观的 UX。
标签: .net datetimepicker null
您无需对其进行修改即可执行此操作。
.net 中的DateTimePicker 实际上内置了一个复选框。
将ShowCheckBox 属性设置为true。
然后您可以使用Checked 属性来查看用户是否输入了值。
http://msdn.microsoft.com/en-us/library/system.windows.forms.datetimepicker.showcheckbox(VS.80).aspx
【讨论】:
这是 CodeProject 文章中关于创建 Nullable DateTimePicker 的一种方法。
我已经重写了
Value属性以接受Null值作为DateTime.MinValue,同时保持标准控件的MinValue和MaxValue的验证。
这是文章中自定义类组件的一个版本
public class NullableDateTimePicker : System.Windows.Forms.DateTimePicker
{
private DateTimePickerFormat originalFormat = DateTimePickerFormat.Short;
private string originalCustomFormat;
private bool isNull;
public new DateTime Value
{
get => isNull ? DateTime.MinValue : base.Value;
set
{
// incoming value is set to min date
if (value == DateTime.MinValue)
{
// if set to min and not previously null, preserve original formatting
if (!isNull)
{
originalFormat = this.Format;
originalCustomFormat = this.CustomFormat;
isNull = true;
}
this.Format = DateTimePickerFormat.Custom;
this.CustomFormat = " ";
}
else // incoming value is real date
{
// if set to real date and previously null, restore original formatting
if (isNull)
{
this.Format = originalFormat;
this.CustomFormat = originalCustomFormat;
isNull = false;
}
base.Value = value;
}
}
}
protected override void OnCloseUp(EventArgs eventargs)
{
// on keyboard close, restore format
if (Control.MouseButtons == MouseButtons.None)
{
if (isNull)
{
this.Format = originalFormat;
this.CustomFormat = originalCustomFormat;
isNull = false;
}
}
base.OnCloseUp(eventargs);
}
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
// on delete key press, set to min value (null)
if (e.KeyCode == Keys.Delete)
{
this.Value = DateTime.MinValue;
}
}
}
【讨论】:
放置一个标记为“启用通知”之类的附加复选框,以启用/禁用 DateTimePicker。
【讨论】:
Tri 的解决方案并不适合我,因此 Grazioli 先生认为,他对此做了一些事情:http://www.codeguru.com/csharp/csharp/cs_controls/custom/article.php/c9645
【讨论】:
我发布了很长的解决方案,在代码 cmets 中有一些关于此控件的特殊问题的发现:
【讨论】:
将ShowCheckBox 属性设置为true。
那么你可以使用Checked属性如下:
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
DateTimePicker thisDateTimePicker = (DateTimePicker)sender;
if (thisDateTimePicker.Checked == false)
{
thisDateTimePicker.CustomFormat = @" "; //space
thisDateTimePicker.Format = DateTimePickerFormat.Custom;
}
else
{
thisDateTimePicker.Format = DateTimePickerFormat.Short;
}
}
【讨论】: