AhDung

/*追求代码质量的野生码农*/

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  107 随笔 :: 0 文章 :: 457 评论 :: 34万 阅读

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

获取时:在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。

posted on   ahdung  阅读(2017)  评论(5编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示