注意:DateTimePicker.Text不靠谱

这鸟属性把我害苦过,特此敬告一下大家。具体表现在:

获取时:在DateTimePicker.ValueChanged事件中,获取到的Text有可能是string.Empty!!!,特别当ValueChanged事件是在构造函数或Load、Shown等启动事件中触发时,得到string.Empty的几率增大;

赋值时:有可能触发不了TextChanged事件(该事件默认不显示在设计器中,但的确是存在的);

可能的原因:先看Value属性的setter源码:

set
{
    bool flag = !DateTime.Equals(this.Value, value);
    if (!this.userHasSetValue || flag)
    {
        if ((value < this.MinDate) || (value > this.MaxDate))
        {
            throw new ArgumentOutOfRangeException("Value", SR.GetString("InvalidBoundArgument", new object[] { "Value", FormatDateTime(value), "'MinDate'", "'MaxDate'" }));
        }
        string text = this.Text;
        this.value = value;//修改value
        this.userHasSetValue = true;
        
        //判断是否拥有句柄
        if (base.IsHandleCreated)
        {
            int wParam = 0;
            NativeMethods.SYSTEMTIME lParam = DateTimeToSysTime(value);
            //发送消息:有可能就是这厮负责改Text
            UnsafeNativeMethods.SendMessage(new HandleRef(this, base.Handle), 0x1002, wParam, lParam);
        }
        if (flag)
        {
            this.OnValueChanged(EventArgs.Empty);//触发ValueChanged事件
        }
        if (!text.Equals(this.Text))
        {
            this.OnTextChanged(EventArgs.Empty);
        }
    }
}

当中没有直接对this.Text赋值,这应该是为了避免陷入死循环,因为Text改变也会触发Value改变,也可能正因为这样,MS采取了迂回的方式来处理Text属性——通过Windows消息机制,而该机制是依赖控件句柄的,换言之只有当控件拥有了句柄才能处理Text。对消息机制和控件句柄我不熟(玩Win32开发的童鞋们那就相当的熟了),我猜控件句柄的生成和分配由OS负责,分配时机也不一定,大概可能是控件显现了才会分配到。所以在构造函数或Load、Shown等启动事件中修改Value时,也许控件还未分配到句柄,所以Text未被处理,导致得不到正确结果~

上述均是猜的哦,有可能对有可能不对。

所以,无论如何,敬告大家,对于DateTimePicker控件,Value和ValueChanged才是你正确的选择,忘掉Text和TextChanged。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C#

免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务、定时轮询数据库同步,定时邮件通知等功能。.NET Framework具有“内置”定时器功能,通过System.Tim...

5046
来自专栏菩提树下的杨过

c#如何启动/干掉/查找 进程

查找/列出进程很容易,但干掉进程得借助系统命令ntsd.exe,详细用法见下面的代码 :  using System; using System.Diagnos...

23510
来自专栏技术博客

MVC JsonResult的使用

此时看一下前端Js中用的是Jquery中的post请求,那么在控制器中没什么特别的。

3502
来自专栏JadePeng的技术博客

c# IO&&线程 打造 定时打开指定程序

     用IO以及线程轻松实现 定时器 ,在指定的时间打开指定的程序:) ?     首先是如何实现定时?这可以单独的用个线程,在时间到的时候打开程序    ...

1966
来自专栏逸鹏说道

Email系列(QQ邮箱 + 含附件的邮箱案例 + 项目实战)上

平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html 邮箱系列:https...

3085
来自专栏挖掘大数据

常用的Hadoop 文件查看工具

packages.config <?xml version="1.0" encoding="utf-8"?> <packages> <package id...

1999
来自专栏码农分享

4.爬虫框架Clawler 爬取优酷电影名 分页+多线程

基于文章三我们实现了爬虫框架单页面应用程序的代码,那么在这一章节我们将使用框架进行内容分页和多线程的操作

1593
来自专栏跟着阿笨一起玩NET

如何实现伪双击事件

第一种方式:可以参考http://blog.csdn.net/zbssoft/article/details/5602658

501
来自专栏木宛城主

SharePoint 2013自定义Providers在基于表单的身份验证(Forms-Based-Authentication)中的应用

由于项目的需要,登录SharePoint Application的用户将从一个统一平台中获取,而不是从Domain中获取,所以需要对SharePoint Ap...

2349
来自专栏更流畅、简洁的软件开发方式

分页解决方案 之 QuickPager的使用方法(在UserControl里面使用分页控件的方法)

      因为我一直没有在UserControl里面使用过QuickPager分页控件,我都是直接在.aspx里面使用,所以这个bug一直没有发现。后来告诉我...

1947

扫码关注云+社区

领取腾讯云代金券