【问题标题】:How to alter a .NET DateTimePicker control to allow enter null values?如何更改 .NET DateTimePicker 控件以允许输入空值?
【发布时间】:2008-11-12 15:48:16
【问题描述】:

更改 .NET DateTimePicker 控件以允许用户输入 null 值的最简单、最可靠的方法是什么?

【问题讨论】:

  • 另一种选择是使用带有 00/00/0000 掩码的 MaskedTextBox。这允许一些直观的数据输入,并且可能是用于退出日期字段的最直观的 UX。

标签: .net datetimepicker null


【解决方案1】:

您无需对其进行修改即可执行此操作。

.net 中的DateTimePicker 实际上内置了一个复选框。

ShowCheckBox 属性设置为true

然后您可以使用Checked 属性来查看用户是否输入了值。

http://msdn.microsoft.com/en-us/library/system.windows.forms.datetimepicker.showcheckbox(VS.80).aspx

【讨论】:

  • 复选框的实现是各种失败。无法正确触发事件。
【解决方案2】:

这是 CodeProject 文章中关于创建 Nullable DateTimePicker 的一种方法。

我已经重写了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;
        }
    }
}

【讨论】:

  • 是的 Grazoli 先生的 NullableDateTimePicker 确实可以完成这项工作,尽管我认为应该有人对其进行审查并尝试摆脱那些丑陋的 WndProc 调用
  • 关于代码的另一件事是它似乎没有做它应该做的事情。我不知道,也许我做错了什么。没有太多时间花在弄乱它上。使用 DTP ShowCheckBox 的想法似乎更有希望。
  • 虽然该解决方案允许用户清除日期,但您不能再将焦点设置到控件或使用键盘重新输入非空日期。前进一步,后退两步。
【解决方案3】:

放置一个标记为“启用通知”之类的附加复选框,以启用/禁用 DateTimePicker。

【讨论】:

    【解决方案4】:

    Tri 的解决方案并不适合我,因此 Grazioli 先生认为,他对此做了一些事情:http://www.codeguru.com/csharp/csharp/cs_controls/custom/article.php/c9645

    【讨论】:

      【解决方案5】:

      我发布了很长的解决方案,在代码 cmets 中有一些关于此控件的特殊问题的发现:

      DateTime Picker null value

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-11
          • 1970-01-01
          • 2011-04-22
          • 2013-08-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多