如何修改.NET DateTimePicker控件以允许输入空值?

24

最简单且最健壮的修改.NET DateTimePicker控件,以允许用户输入null值的方法是什么?


另一个选项是使用具有掩码“00/00/0000”的MaskedTextBox。这允许相当直观的数据输入,并可能是撤消日期字段最直观的用户体验。 - KyleMit
6个回答

47

1
复选框的实现有很多问题。无法正确触发事件。 - Nick Bedford

6
这是一篇关于创建可空 DateTimePicker的 CodeProject 文章中的方法。

我已经重写了 Value 属性,以接受 Null 值作为 DateTime.MinValue,同时保持标准控件的 MinValueMaxValue 的验证。

以下是文章中自定义类组件的版本。
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;
        }
    }
}

1
是的,Grazoli先生的NullableDateTimePicker确实可以胜任工作,虽然我认为有人应该对其进行审查并试图摆脱那些丑陋的WndProc调用。 - Calanus
代码的另一个问题是它似乎没有按照预期执行。我不知道,也许是我做错了什么。我没有太多时间去折腾它。使用DTPs ShowCheckBox的想法似乎更有前途。 - IAbstract
虽然该解决方案允许用户清除日期,但您不能再将焦点设置到控件上或使用键盘重新输入非空日期。前进一步,后退两步。 - Chad

4
在DateTimePicker旁边添加一个额外的复选框,标记为“启用通知”,以启用/禁用DateTimePicker。

2

1

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;
    }
}

从所有提出的解决方案中,这是最简单、最短和用户友好的。 - kgzdev

0

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