可空 Compact Framework DateTimePicker 自定义控件






3.91/5 (4投票s)
一款用于紧凑框架的自定义 DateTimePicker 控件,用于处理 DBNull 值。
引言
标准 DateTimePicker
控件不处理 DBNull
值,而这通常是呈现数据库列时所需要的。它总是显示一个值,因此当实际上没有值时,它看起来好像被用户填写了。对于医疗设备来说,这是一个特别的问题,医疗设备被禁止为用户预先填充数据。尝试派生一个默认为 DBNull.Value
的控件可能会导致包含窗体加载时出现 NotSupportedException
。
此控件用于紧凑框架,实现了一个 Facade 模式,将 DateTimePicker
封装在一个自定义控件中,以处理 DBNull
值,并在控件具有空值时使封装的 DateTimePicker
不可见,因此控件看起来像一个空的文本框。当控件设置为非空值时,DataTimePicker
变为可见,并允许用户与其交互。当用户点击空白(空)控件时,它会通过加载 DateTime.Now
并使控件可见来响应。
背景
已经有各种尝试来解决 DateTimePicker
的局限性,但其他解决方案在紧凑框架中效果不佳,因为 DateTimePicker
的功能减少了。这是一个相当简单的解决方案,它满足了在没有显式输入值时显示为空的需求,在窗体加载时默认为空值而不会抛出 NotSupportedException
,向用户呈现熟悉的 DateTimePicker
交互,并为开发人员提供熟悉的设计时体验。
使用代码
代码的使用几乎与原生 DateTimePicker
完全相同。一旦 ControlLibrary 被编译并添加到工具箱中,就可以将 CFDateTimePicker
拖放到窗体设计表面。DateTimePicker
的许多常用属性都作为自定义控件的属性公开,并在“属性”窗口中呈现。
在设计时双击该控件会创建一个值更改事件处理程序,当用户更改字段的值时,该处理程序会被调用
private void cfDateTimePicker1_CFDateTimeValueChanged(object sender, DateTime NewValue)
{
}
请注意,事件参数包含新更改的值,为一个 DateTime
结构。
包含一个小型 Windows Mobile Pocket PC 应用程序,以演示该控件的一些基本用途。
对于那些不熟悉 .xmta 文件的人来说,它定义了控件的设计时属性。
关注点
开发人员遇到的一个问题是,Value
属性的默认值为 DBNull.Value
。这通常会导致包含窗体加载时出现 NotSupportedException
。其原因是,在设计时,当控件被拖放到窗体上时,Visual Studio 获取 Value
属性并将其设置为资源文件,以在窗体加载时用作默认值。如果 Value
为 DBNull.Value
,则将其插入到资源文件中,并在窗体加载时导致异常。为了解决这个问题,我使用了控件的父类的 Site.DesignMode
属性来检测控件是否处于设计模式,并且在这种情况下,返回一个 DateTime.Now
值,以便资源文件具有一个非空值。在窗体加载期间,我断言一个私有标志 IsInitializing
,以忽略来自资源文件的值。