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。

 
 

DateTimePicker.Text不靠谱的更多相关文章

  1. 注意:DateTimePicker.Text不靠谱

    这鸟属性把我害苦过,特此敬告一下大家.具体表现在: 获取时:在DateTimePicker.ValueChanged事件中,获取到的Text有可能是string.Empty!!!,特别当ValueCh ...

  2. 不靠谱的Paypal及海外网站

    昨天因为报名参加某个比赛,需要用到Paypal付款,整整折腾了我一个小时.我先是使用自己的银行储蓄卡,到最后一步需要银行确认,提示我需要安装个插件才能输入密码.安装完插件后需要重启浏览器,整个流程又要 ...

  3. UC何小鹏:移动互联网创业需警惕五大“不靠谱

    http://tech.qq.com/a/20140121/012443.htm 腾讯科技 启言 1月21日报道 移动互联网创业很容易犯错误,一不小心就陷入“坑”中.UC也是如此.近日,UC创始人何小 ...

  4. 参加Java培训到底靠不靠谱?

    导读 科技越发展,社会越进步,人们越便利,便衍生出更多的人从事程序员这个高大上的职业,可哈尔滨Java培训学校这么多,到底靠不靠谱,会不会处处是陷阱,爱尚实训帮你擦亮眼 随着时代的发展,越来越多的人对 ...

  5. mysql进阶(十)不靠谱的FLOAT数据类型

    今天在设计数据表时,突然发现原来FLOAT原来是很不靠谱的,所以在这里建议大家换成DOUBLE类型, 原因是: 在mysql手册中讲到,在MySQL中的所有计算都是使用双精度完成的,使用float(单 ...

  6. Shell脚本中字符串判空:使用-z 字符串长度为0时,为真,-n字符串长度不为0,为真。这两个都不靠谱【转】

    最近发现使用  -z   和  -n  来判断字符串判空,或不空时,很不靠谱. 使用下面的方法最可靠: if [ "x${value}" == "x" ]    ...

  7. 出租WiFi到底靠不靠谱?

    创业是一种心态,也是不断的探索,他融入我们的生活,从日常中积累,从小微处启航. 一.背景交代 最近在换工作,本周搬到新租的单身公寓,空间不大,倒是干净整洁.委托租房中介帮忙开通宽带,告知是电信网最低开 ...

  8. SimpleDateFormat之后为何多了一年,难道Java API也这么不靠谱?

    这一切的背后到底是机器故障,还是程序的bug? 难道Java API也不靠谱 朋友在我博客上发现一时间明显错误,操作时间怎么会是2016年?在同一个for循环输出到页面的时间,唯独这一个时间不对,整整 ...

  9. DevOps|从特拉斯辞职风波到研发效能中的不靠谱人干的荒唐事

    今天发生了一件大事特拉斯辞任英国首相,我想借着这件事情说下我看到的一件研发效能的荒唐事,这其中的关联也许就是「都用了不靠谱的人」. 两件事情 今儿一早就听到,2022年10月20日英国第78任首相伊丽 ...

随机推荐

  1. http协议报头信息和主体鉴别

    http协议报头信息和主体是使用一个空行分开.这是什么空行?简单的说,那是,\r\n\r\n. 所以会server数据的回归\r\n\r\n结果分离,一个是标题信息.它是一个消息的文本. C#例如,下 ...

  2. Objective-C的动态特性

    最近几年中涌现了大量的Objective-C开发者.有些是从动态语言转过来的,比如Ruby或Python,有些是从强类型语言转过来的,如Java或C#,当然也有直接以Objective-C作为入门语言 ...

  3. 提高mysql千万级数据SQL的查询优化30条总结

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  4. bluetooth发展(五岁以下儿童)------蓝牙功能测试(一个)

    newton板已出版.下面再组织我调试的一小方面,,蓝牙功能的实现和测试: 转载请注明出处:http://blog.csdn.net/wang_zheng_kai 以下是我写的newton开发板中bl ...

  5. C#验证IP地址

    using System.Net; try { IPAddress a = IPAddress.Parse(输入的IP字符串); } catch (System.Exception ex) { Mes ...

  6. 关于PHP的工作流引擎

    关于PHP的工作流引擎,除了三大主流开源:PorcessMaker(排名第一,因其有拖放式图形定义界面),RadiCore(基于PETRI NET)和CuteFlow以外,另外还有一个不为人知的,但却 ...

  7. IE8下div中2个button仅仅显示一个

    IE8下div中2个button仅仅显示一个,代码例如以下: <div id="adviceType" style="display: none;" &g ...

  8. Visual Studio测试工具TestDriven.NET2.2

    原文:Visual Studio测试工具TestDriven.NET2.2 关于TestDriven.NET的文章很多,有很详细的说明,我不太会单元测试只是每次要运行程序才能调试觉得太麻烦了,所以找了 ...

  9. Best JavaScript Tools for Developers

    JavaScript solves multiple purposes; it helps you to create interactive websites, web applications, ...

  10. LINUX SCP 远程 文件 复制

    首先,以确保直接两个机器IP可以在每个ping通过 然后使用SCP命令从第一台主机向第二台主机复制文件 scp src chiwei@192.168.8.144:/home/chiwei/mydisk ...