zoukankan      html  css  js  c++  java
  • 注意: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。

  • 相关阅读:
    从Malvar的论文与两通道QMF设计原理到Speex 与 ISAC中的QMF使用
    转:薪酬与GDP
    转:A PitchEnergy Quantizer for Codec2
    韩国JoonHyuk Chang DSP Lab 专家
    Audio Codec : MPEG2 AAC 反量化模块
    VOIP Codec 三剑客之 SILK (1) 介绍
    CELT 视频PPT介绍
    HEAAC专利
    关于变换编码算法的(Blocking artifacts)和(Ringing artifacts)(一)
    转:免费国际长途 热门应用Line发布中文版
  • 原文地址:https://www.cnblogs.com/ahdung/p/3217423.html
Copyright © 2011-2022 走看看