DateTimePicker控件绑定可空DateTime值的怪异情况解决办法

场景:

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&

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值