场景:
WinForms窗体上有一个DateTimePicker控件,ShowCheckBox设置为true,控件放在TabControl的非活动TabPage中。
这个DateTimePicker控件的Value属性绑定到数据源的Date属性,并且Date属性类型为Nullable<DateTime>。
要求:
当Date属性的值为空时,要将DateTimePicker的Checked属性设置为false,而且设置为true并显示实际值。
方法:
在DateTimePicker的DataBinding的Format事件的处理程序中,通过检查事件参数的Value来确定值是否为空,如果为空就设置DateTimePicker的Checked为false,否则正常显示。
现象:
如果DateTimePicker放在活动的TabPage上,可以正常工作,但如果放到非活动的TabPage上就无法正常工作,DateTimePicker的复选框不会按我们所期望的那样被清除。通过查看IntelliTrace的信息可以发现,DateTimePicker抛出一个ArgumentOutOfRangeException。这说明Format事件没有触发,断点后也证明了这个猜测。
原因:
通过查阅MSDN以及翻看Control数据绑定方面的源代码,我发现只有在DataBinding.IsBinding为true时才会去引发Format事件,而IsBinding为true的一个必要条件是所绑定控件的Created属性为true。回过头再来看DateTimePicker,在进行数据绑定前检查Created属性,当它被放置在活动的TabPage中时返回true,而放在非活动的TabPage中时返回false&