可设置空值(Nullable)的DateTimePicker

由于WinForm自带的DateTimePicker不能设置空值(Null),所以我基于原来的DateTimePicker做了扩展。

若有bug,可反馈,我再修改。

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace WinFormTest
{
    public class DateTimePicker2 : DateTimePicker
    {
        const string NullableFormat = " ";
        bool isSelfSetting;
        string originalCustomFormat;
        bool originalCustomFormatInitialized;
        DateTimePickerFormat? originalFormat;

        bool IsNullableState
        {
            get { return this.Format == DateTimePickerFormat.Custom && this.CustomFormat == NullableFormat; }
        }

        void SetNullable(bool nullable)
        {
            if (!this.originalFormat.HasValue)
            {
                this.originalFormat = this.Format;
            }
            if (!this.originalCustomFormatInitialized)
            {
                this.originalCustomFormat = this.CustomFormat;
                this.originalCustomFormatInitialized = true;
            }

            this.isSelfSetting = true;
            this.Format = nullable ? DateTimePickerFormat.Custom : this.originalFormat.Value;
            this.CustomFormat = nullable ? NullableFormat : this.originalCustomFormat;
            this.isSelfSetting = false;
        }

        #region Properties

        [Browsable(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public DateTime? Value2
        {
            get { return this.IsNullableState ? (DateTime?)null : Value; }
            set
            {
                if (value.HasValue)
                    Value = value.Value;
                SetNullable(!value.HasValue);
            }
        }

        public new DateTimePickerFormat Format
        {
            get { return base.Format; }
            set
            {
                if (!this.isSelfSetting)
                    this.originalFormat = value;
                base.Format = value;
            }
        }

        public new string CustomFormat
        {
            get { return base.CustomFormat; }
            set
            {
                if (!this.isSelfSetting)
                {
                    this.originalCustomFormat = value;
                    this.originalCustomFormatInitialized = true;
                }
                base.CustomFormat = value;
            }
        }

        #endregion

        #region Events

        protected override void OnGotFocus(EventArgs e)
        {
            if (this.IsNullableState)
                SetNullable(false);
            base.OnGotFocus(e);
        }

        protected override void OnMouseDown(MouseEventArgs e)
        {
            if (this.IsNullableState)
                SetNullable(false);
            base.OnMouseDown(e);
        }

        protected override void OnKeyDown(KeyEventArgs e)
        {
            SetNullable(e.KeyCode == Keys.Back || e.KeyCode == Keys.Delete);
            base.OnKeyDown(e);
        }

        #endregion
    }
}
时间: 2024-12-22 16:41:27

可设置空值(Nullable)的DateTimePicker的相关文章

SQL 设置空值(NULL)

update TABLE set VALUE=NULL; 将表 TABLE 的 VALUE 字段设置为 NULL, 没有数据. 对于字段的值为NULL的,执行 SQL 的 C API 返回的将是: 字符串  ---  “” 整型     ---  0

jqgrid单元格设置空值的方法

项目中使用jqgrid,在使用的场景下经常需要清空单元格内容,于是使用了下面的代码: 1 $("#jqgrid1").jqGrid('setCell',rowId, 'column', ''); 然后竟然没有起作用,值还是有的,这个不可能jqgrid没有这种方式,于是没有查文档,查看了一下页面的源代码,发现在初始化的时候,没有赋值的情况下,html的元素内容为 1 &nbsp 于是自己做了如下的代码试验: 1 $("#jqgrid1").jqGrid('se

Nullable<T>、Nullable、null、?修饰符的区别

这章我们讨论一下Nullable<T>.Nullable.null.?修饰符的区别 原创文章 Nullable<T>的前世今生 讨论它们之前,我们有必要讨论一下Nullable<T>的前世今生,目的也是为了让我们更好地了解他们的区别,加深印象. 在C#2以前,有一个问题经常会困扰我们,相信大部分人都想过此问题. 在数据库中,比如设置一个表如下(电脑表Computer) 字段名 类型 是否允许空值 Color varchar Y Age int N CpuSpeed in

添加一个时间插件: 1.把插件放到 public目录 下 datetimepicker

<!-- 引入时间插件 --><link href="__PUBLIC__/datetimepicker/jquery-ui-1.9.2.custom.min.css" rel="stylesheet" type="text/css" /><script type="text/javascript" charset="utf-8" src="__PUBLIC__/da

jquery.datetimepicker 没有显示分钟问题

今天需要将某一个列表的搜索时间精确的分钟,由于使用的是jquery.datetimepicker.以前项目中都使用laydate,所以网上查找了一下需要设置什么参数. 看了好几个博客都不能满足我的要求 最终在文档中发现需要设置:step : 1 即可! 其他Js部分设置如下: jQuery.datetimepicker.setLocale('zh');jQuery('#date_start').datetimepicker({ datepicker : true, step : 1, start

如何使用表单

如何使用表单 原文:Working with Forms作者:Rick Anderson.Dave Paquette.Jerrie Pelser翻译:姚阿勇(Dr.Yao)校对:孟帅洋(书缘) 这篇文章演示了如何使用表单以及表单中常用的 HTML 元素.HTML 的 Form 元素提供了 Web 应用向服务器回发数据的主要机制.本文的大部分在描述 Tag Helpers 以及它们如何能帮你有效地构建健壮的表单.在阅读本文之前,我们建议你阅读一下 Tag Helpers . 在很多情况下,HTML

终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了

前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说过 这么多年 秋天有两点没变 一是还是单身 另外一个就是cyq.data还没开源 终于等到开源了! 也许吧,只有把cyq.data最终开源了,才能解决单身问题,不然我在这上面花的时间太多,都没时间和妹子聊天了. 几个重要网址: 源码SVN地址:https://github.com/cyq1162/c

Swift开发学习(一):初始篇

http://blog.csdn.net/powerlly/article/details/29351103 Swift开发学习:初始篇 关于 苹果公司于WWDC2014(Apple Worldwide Developers Conference. June 2-6, San Francisco)发布新的编程语言--Swift.在这里就不重复介绍了,本篇主要简单列举几点,然后介绍Swift入门操作. Swift是什么 Swift是用来写iOS和OS X程序的编程语言. Swift吸取了C和Obj

Spring.Net学习笔记(5)-集合注入

一.开发环境 系统:Win10 编译器:VS2013 .net版本:.net framework4.5 二.涉及程序集 Spring.Core.dll 1.3.1 Common.Loggin.dll 三.开发过程 1.项目结构 2.编写Person.cs namespace SpringNetSetDi { public class Person { public string RealName { get; set; } public string NickName { get; set; }