我正在使用Visual Studio 2022修改c# Windows Form程序,我正在寻找一种显示空日期字段的方法(最好带有两个"/";分隔日、月、年)。
前面的开发人员使用了一个遮罩文本框,显示"_/__/__ "当没有写入日期,但客户端想要更直观和更简单的方式来写入日期时,它会自动将光标放在第一个位置,同时还会检查日期是否正确。
我想到使用DateTimePicker,因为它会自动检查所写的日期是否正确,并且它还具有日历功能,使其更容易,但客户端不喜欢默认显示日期的事实。我尝试使用自定义空白格式,但随后用户需要选择一个日期与日历,而不是手动为它工作,我知道她不会喜欢它。
下面是我写的代码:(dtp的默认格式是自定义格式,显示"//private void dtp_birthdate_ValueChanged(object sender, EventArgs e)
{
dtp_birthdate.Format = DateTimePickerFormat.Short;
}
private void btn_enter_Click_1(object sender, EventArgs e)
{
if (dtp_birthdate.Format == DateTimePickerFormat.Custom)
{
lbl_errorMessage.Visible = true;
errorProvider6.SetError(dtp_birthdate, "The birth date must be written!");
return;
}
}
是否有办法使我的dtp显示一个空的日期,而不使用自定义格式?我应该使用另一种类型的文本框吗?
感谢使用这个自定义DateTimePicker,I didn't code it
,发现它我相信这里的Stackoverflow
简单应用
nullableDateTimePicker1.Value = DateTime.MinValue;
控制
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace WindowsFormsLibrary.Controls
{
public class NullableDateTimePicker : DateTimePicker
{
private DateTimePickerFormat originalFormat = DateTimePickerFormat.Short;
private string originalCustomFormat;
private bool isNull;
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
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 = Format;
originalCustomFormat = CustomFormat;
isNull = true;
}
Format = DateTimePickerFormat.Custom;
CustomFormat = " ";
}
else // incoming value is real date
{
// if set to real date and previously null, restore original formatting
if (isNull)
{
Format = originalFormat;
CustomFormat = originalCustomFormat;
isNull = false;
}
base.Value = value;
}
}
}
protected override void OnCloseUp(EventArgs eventArgs)
{
// on keyboard close, restore format
if (MouseButtons == MouseButtons.None)
{
if (isNull)
{
Format = originalFormat;
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)
{
Value = DateTime.MinValue;
}
}
/// <summary>
/// Indicates if Value has a date or not
/// </summary>
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public bool IsNullValue => Value == DateTime.MinValue;
}
}