使用 DateTimePicker 控件

DateTimePicker 控件显示日期和/或时间信息,并且可以作为一个用户用以修改日期和时间信息的界面。控件的显示包含由控件格式字符串定义的字段。当下拉 DateTimePicker 控件时,将会显示一个 MonthView 日历。

该控件有两种不同的模式:

可以使用控件将日期按照各种预先设置的格式显示,这些格式包括短日期(11/14/97)、长日期(Friday, November 14, 1997)和时间(7:00:00 PM)。也可以使用格式字符串来指定自定义格式,或使用回调字段创建自己的格式。

下拉日历模式的DateTimePicker 控件

时间格式模式的DateTimePicker 控件

可能的用途

使用控件的两种模式

DateTimePicker 对输入日期和时间的值来说就象一个被屏蔽的编辑控件。日期或时间的各个部分在控件的编辑部分中是被作为独立的字段对待的。当用户单击每个字段时,字段将被突出显示,并且可以通过上下箭头来增减相应字段的值。用户也可以在必要的地方直接在控件中输入值。

UpDown 属性决定了控件属于何种模式。当 UpDown 被设为 False时,控件就属于下拉日历模式(缺省值)。如果 UpDown 属性被设为 True,那么DateTimePicker 就属于时间格式模式。

在时间格式模式中,控件的右部将出现两个滚动箭头。用户可以通过用鼠标单击这些箭头来增减当前选中字段的值。在下拉日历模式中,该控件下拉出一个用户可以选择日期的日历。

下拉日历有 MonthView 控件的大多数特性。有关如何建立和格式化 DateTimePicker 控件的下拉日历部分的详细信息,请参阅“使用 MonthView 控件”。

设置和返回日期

在控件中当前选中的日期是由 Value 属性决定的。可以在显示控件前(例如,在设计时或在Form_Load事件中)设置控件的 Value 属性,以便决定在控件中一开始选中哪个日期:

DTPicker1.Value = "10/31/97"

缺省情况下,控件的 Value 被设置为当前日期。如果在代码中更改了 DateTimePicker 的 Value 属性,控件会自动更新并反映出新的设置。

Value 属性返回一个原始的日期值,或者空值。DateTimePicker 控件具有几个属性,可以返回有关显示日期的特定信息:

使用 Change 事件来确定用户何时更改了控件中的日期值。

使用CheckBox来选择无日期

使用 CheckBox 属性能够指定控件是否返回日期。缺省情况下,CheckBox 的值为 False,并且控件总是返回一个日期。

要让用户能够指定无日期,可以将 CheckBox 属性设置为 True(例如,如果使用 DateTimePicker 控件输入工程的完成日期而该工程还没有完成)。

如果 CheckBox 属性设为True,那么在控件日期和时间左边的编辑部分中将出现一个小的复选框。如果这个复选框没有被选中,那么 Value 属性返回一个空值。如果选中了这个复选框,那么控件通过 Value 属性返回当前显示日期。

使用日期和时间的格式

DateTimePicker 提供了很强的灵活性,以便在控件中将日期和时间的显示格式化。可以使用所有标准的 Visual Basic 格式化字符串,也可以使用回调字段来创建自定义格式。

Format 属性决定了控件如何格式化原始日期值。可以从预定义的格式化选项中选择一个,或使用控件的自定义格式化功能。

CustomFormat 属性定义了用于显示控件内容的格式表达式。可以通过指定格式字符串来告诉控件如何将日期输出格式化。DateTimePicker 控件支持下面这些格式字符串:

字符串描述

d1或2位的日。

dd2位日,1位值前加0。

ddd3字符星期缩写。

dddd星期全名。

h12小时格式1或2位小时。

hh12小时格式2位小时,1位值前加0。

H24小时格式1或2位小时。

HH24小时格式2位小时,1位值前加0。

m1或2位分钟。

mm2位分钟,1位值前加0。

M1或2位月份。

MM2位月份,1位值前加0。

MMM3字符月份缩写。

MMMM月份全名。

s1或2位的秒。

ss2位的秒,1位值前加0。

t1字母 AM/PM 缩写(“AM”简写为“A”)。

tt2字母 AM/PM 缩写(“AM”简写为“AM”)。

X回调字段,使程序员可以控制显示字段(如下所示。)可以使

用一系列多个‘X’来表示唯一的回调字段。

y1位年份(即1996显示为“6”)。

yy年份的最后2位(即1996显示为“96”)。

yyy完整的年份(即1996显示为“1996”)。

可以在格式字符串中添加主体文本。例如,如果希望控件按照“Today is: 05:30:31 Friday Nov 14, 1997”格式显示当前日期,那么格式字符串应为“'Today is: 'hh':'m':'s ddddMMMdd', 'yyy”。主体文本必须用单引号括起来。

利用回调字段创建自定义格式

上面描述的自定义格式之一就是回调字段。回调字段允许用户对格式字符串某个部分的输出进行自定义。要声明回调字段,必须在格式字符串主体中包含一个或多个‘X’字符(ASCII 码为88)。回调字段按照从左到右的顺序显示。

当用包含一个或多个回调字段的格式显示新的日期时,对于每个回调字段都会引发 FormatFormatSize 事件。可以使用 Format 事件来指定一个自定义响应字符串,同时可以通过 FormatSize 事件决定用于显示该字符串的空间。通过这种行为可以对回调字段的显示实现完全的控制。

每个‘X’序列都具有不同的含义。例如,X 可能表示“st/nd/rd/th”(即“1st一”“2nd”“3rd”“4th”等),而“XX”则可能表示“第一”“第二”“第三”“第四”等。这些字段并不对用户的文本进行格式化,而是把日期转化为可显示的格式。

例如,如果想要用英语显示月份的同时用西班牙语显示,应使用类似于下面的格式:

July (Julio) 29

需要创建的格式字符串如下所示:

MMMM XXXX d

在处理Format FormatSize 事件时,可以通过将输入格式字符串和“XXXX”进行比较来检查调用了哪个回调字段。如果字段字符串匹配,那么将生成输出字符串“(Julio)”,同时可以得到输出字符串的长度。X的个数仅被应用程序用来确定为回调字段提供什么样的文字。在处理FormatSize 事件时,文本的大小可以在程序中通过计算得到。

Format 事件在控件需要填充回调字段时被调用,例如,当用户从下拉日历中选择了不同的日期时。但是 FormatSize 事件仅在格式字符串发生变化时被调用(例如,将格式从“XX”变为“XXXX”时。)这意味着在 FormatSize 事件中计算回调字段大小时,必须考虑 Format 事件返回的任何可能的结果。

  1. 例如,可以应用下面的过程来实现上面提到的格式字符串中的回调字段。
    1. 在窗体的(General)(Declarations)部分,声明一个数组变量作为查找表来保存西班牙文的月份名称:
    Private sSpMonth(12) As String
    
    1. 在窗体的 Load 事件中,充填查找表,并将 DTPicker 设置为使用自定义格式字符串:
    sSpMonth(0) = "Enero"
    sSpMonth(1) = "Febrero"
    sSpMonth(2) = "Marzo"
    sSpMonth(3) = "Abril"
    sSpMonth(4) = "Mayo"
    sSpMonth(5) = "Junio"
    sSpMonth(6) = "Julio"
    sSpMonth(7) = "Agusto"
    sSpMonth(8) = "Septiembre"
    sSpMonth(9) = "Octubre"
    sSpMonth(10) = "Noviembre"
    sSpMonth(11) = "Diciembre"
    
    DTPicker1.Format = dtpCustom
    DTPicker1.CustomFormat = "MMMM (XXX) dd, yy"
    
    1. FormatSize 事件中,从可能的返回值列表中找到最长的值。将这个值的长度指定为格式字符串的长度。这样将会避免在更改控件值时剪 短西班牙文的月份名称。
    Private Sub DTPicker1_FormatSize(ByVal CallbackField As String,
    Size As Integer)
    Dim iMaxMonthLen As Integer
    Dim iC As Integer
    Select Case CallbackField
    Case "XXX"
    iMaxMonthLen = 0
    For iC = 0 To 11
    If iMaxMonthLen < Len(sSpMonth(iC)) Then
    iMaxMonthLen = Len(sSpMonth(iC))
    End If
    Next iC
    End Select
    Size = iMaxMonthLen
    End Sub
    
    1. Format 事件中,返回适当的值作为格式化字符串:
    Private Sub DTPicker1_Format(ByVal CallbackField As String,
    FormattedString As String)
    Select Case CallbackField
    Case "XXX"
    FormattedString = sSpMonth(DTPicker1.Month - 1)
    End Select
    End Sub
    

可以通过重复“X”字符创建唯一的回调字段。这样,格式字符串“XX dddd MMM dd', 'yyy XXX”就包含了两个回调字段。可以使用 Select 或 If 语句在 Format FormatSize 事件中处理多个回调字符串。

回调字段被视为有效的字段处理,因此应用程序必须准备好处理CallbackKeyDown 事件。可以使用该事件处理回调字段中的单个击键,同时提供击键合法性检查或自动完成输入。例如,如果用户在输入月份时输入了字母“D”,可以使用 CallbackKeyDown 事件用“十二月”填充回调字段。

格式化 Calendar 控件

有多种选择可以对控件的下拉日历部分进行格式化。所有以“日历”打头的DateTimePicker 的属性都能影响下拉日历的格式。这些属性分别对应于 MonthView 控件中的属性。例如,DateTimePicker 的 CalendarTitleTextColor 属性和 MonthView 的 TitleTextColor 属性对应。有关日历格式化问题的详细信息,请参阅“使用 MonthView 控件”主题。

键盘界面

可以通过键盘对Calendar 控件进行操作。下表描述了在运行时可以对控件进行的各种操作。

 

描述
左箭头键 选定左边的相邻字段。如果在最左字段被选定时按下此键,则换行选定最右字段。
右箭头键 选定右边的相邻字段。如果在最右字段被选定时按下此键,则换行选定最左字段
上箭头键 增加选定字段的值。
下箭头键 减少选定字段的值。
HOME键 将选定字段的值改为其上界。
END键 将选定字段的值改为其下界。
上箭头键 增加选定字段的值。
下箭头键 减少选定字段的值。
数字键盘上的(+) 增加选定字段的值。
数字键盘上的(-) 减少选定字段的值。

下表描述了显示下拉日历时可以进行的不同操作。

键描述

左箭头键选定下一天。

右箭头键选定前一天。

上箭头键选定上一周的同一天。

下箭头键选定下一周的同一天

PAGE UP键将显示滚动到过去的月。

PAGE DOWN键将显示滚动到将来的月。

CTRL+PAGE UP键将显示滚动到上一年。

CTRL+PAGE DOWN键将显示滚动到下一年。

发行注意   DateTimePicker 控件是 COMCT232.ocx 文件中的 ActiveX 控件组的一部分。如果要在应用程序中使用 DateTimePicekr 控件,必须将 COMCT232.ocx 文件添加到工程中。在发行应用程序时,需要将 COMCT232.ocx 文件安装到用户的 Microsoft Windows 的 System 或System32 目录中。有关如何在工程中添加 ActiveX 控件的详细内容请参阅《Visual Basic 程序员指南》