在VB中,构建一个UNIX时间转换自定义控件

分享于 

15分钟阅读

Web开发

  繁體

介绍

本文介绍了自定义控件的构造,该控件将UNIX时间转换为有用的可以读日期,以便在WinForms应用程序。 控件将接受标准日期或者UNIX时间值,并可以将值转换为任何方向的( 从UNIX时间到日期或者从日期到UNIX时间)。

图 1: 运行的测试应用程序。

控件包含两个可以设置为控制显示输出和控件可用性的属性。 如果用户单击控件,它将在UNIX时间和正常日期之间启用或者禁用该属性,如果希望允许用户以一种格式编辑值,并在另一个格式中查看该控件,这可能会非常有用。 另一个属性是"方向"。 方向用于确定控件是否将值显示为UNIX时间或者标准日期。

入门

为了开始,解压缩包含的项目,并在 Visual Studio 2008环境中打开解决方案。 在解决方案资源管理器中,应注意以下文件( 图 2 ):

图 2: 解决方案资源管理器

从图 2中可以看到,有两个项目。 UnixTime 是自定义控件项目,它包含一个自定义控件( UTConverter.vb )。 第二个项目( ControlTest ) 是一个用于测试控件的WinForms应用程序。

自定义控件( utconverter。vb )

自定义控件是扩展标准 TextBox 控件的类。

代码很简单。 如果你需要在IDE中打开代码视图,你将看到代码文件以以下库 imports 开头:

Imports SystemImports System.ComponentModelImports System.DrawingImports System.TextImports System.Windows.Forms

imports 之后,类被定义为( 注意类继承 TextBox ):

PublicClass UTConverter
 Inherits TextBox

然后定义枚举;这里枚举称为 Direction。 枚举用于定义扩展 TextBox 控件中显示的日期是否将显示日期或者UNIX时间戳值。 可以在 enumeration member定义日期 1或者after成员变量之后,定义两个 private 成员变量,一个 Boolean 值用来确定是否启用了"单击时转换"。

#Region"Members" 
 PublicEnum Direction
 ToUnix
 ToDate
 EndEnumPrivate mCurrentDirection As Direction
 Private mConvertOnClick AsBoolean#End Region

接下来,定义构造函数;在构造函数中,通过将 CurrentDirection 属性设置为 Direction.ToDate,并将 ConvertOnClick 属性设置为 true,设置控件的默认值。 默认情况下,控件通常将日期显示为日期,并在单击时将日期转换为UNIX时间戳值。

#Region"Constructor" 
 PublicSubNew()
 ' This call is required by the Windows Form Designer. InitializeComponent()
 ' Add any initialization after the InitializeComponent() call. CurrentDirection = Direction.ToDate
 ConvertOnClick = TrueEndSub#End Region

构造器之后,设置一个区域以包含控件属性的添加。 第一个属性为 CurrentDirection,它提供对 mCurrentDirection 成员变量的public 访问,用于确定控件是否将它的值显示为日期。 其他属性 ConvertOnClick 用于启用或者显示在运行时控件中的UNIX和正常日期之间转换的功能。

#Region"Properties" 
 <CategoryAttribute("UNIX Time"), _
 Browsable(True), _
 BindableAttribute(False), _
 DescriptionAttribute("Convert to or from UNIX time.")> _
 PublicProperty CurrentDirection() As Direction
 GetReturn mCurrentDirection
 EndGetSet(ByVal value As Direction)
 mCurrentDirection = value
 EndSetEndProperty <CategoryAttribute("UNIX Time"), _
 Browsable(True), _
 BindableAttribute(False), _
 DescriptionAttribute("Enable or disable On Click UNIX Time format 
 conversion.")> _
 PublicProperty ConvertOnClick() AsBooleanGetReturn mConvertOnClick
 EndGetSet(ByVal value AsBoolean)
 mConvertOnClick = value
 EndSetEndProperty#End Region

定义的下一个区域为 Methods ;本节包含用于将unix日期转换功能提供给该自定义控件的代码。

#Region"Methods"

ConvertToDateTime 函数将UNIX时间戳转换为短日期字符串;这很容易通过添加给UNIX时间戳的基线数量。

'''<spanclass="code-SummaryComment"><summary></span>''' Convert Unix time to date'''<spanclass="code-SummaryComment"></summary></span>'''<spanclass="code-SummaryComment"><paramname="unixTime"></param></span>'''<spanclass="code-SummaryComment"><remarks></remarks></span>PrivateSub ConvertToDateTime(ByVal unixTime AsDouble)
 Dim convertedDateTime As DateTime = _
 New DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(unixTime)
 Me.Text = convertedDateTime.ToShortDateString()EndSub

下一个函数将日期( 作为短日期字符串) 转换为UNIX时间格式:

'''<spanclass="code-SummaryComment"><summary></span>''' Convert date to Unix time'''<spanclass="code-SummaryComment"></summary></span>'''<spanclass="code-SummaryComment"><paramname="dt"></param></span>'''<spanclass="code-SummaryComment"><remarks></remarks></span>PrivateSub ConvertToUnixTime(ByVal dt AsDate)
 Me.Text = (dt - New DateTime(1970, 1, 1, 0, 0, _
 0)).TotalSeconds.ToString()
 ' Note: This operation will truncate the value to its' minimum for the date time shown; for example, if"500000000" is' entered into the textbox, this operation will alter the value to'"499996800"' which is the minimum value for the date 11/5/1985. If you need to' maintain the exact Unix time value, create a separate variable to' store it in and set it to the Unix time stamp prior to converting' from Unix time to a date.EndSub

控件的已经验证事件处理程序用于根据控件属性的CurrentDirection 设置日期或者UNIX时间来更新日期或者UNIX时间值。

'''<spanclass="code-SummaryComment"><summary></span>''' Upon validation, update the control to''' display the converted Unix time'''<spanclass="code-SummaryComment"></summary></span>'''<spanclass="code-SummaryComment"><remarks></remarks></span>PrivateSub UTConverter_Validated(ByVal sender AsObject, _
 ByVal e As EventArgs) HandlesMyBase.Validated
 TryIf mCurrentDirection = Direction.ToDate Then ConvertToDateTime(Convert.ToDouble(Me.Text))
 Else ConvertToUnixTime(Convert.ToDateTime(Me.Text))
 EndIfCatch' do nothingEndTryEndSub

键按事件处理程序配置为忽略可能键入到控件中的非数值值。 控件接受数字,控制字符和减号。 使用这种方式限制键按键可以使用户输入数字和使用退格键,输入减少 1/1/1970 时的日期。

'''<spanclass="code-SummaryComment"><summary></span>''' Disregard non-numeric values; allow''' numbers, controls, and the negative''' sign.'''<spanclass="code-SummaryComment"></summary></span>'''<spanclass="code-SummaryComment"><paramname="sender"></param></span>'''<spanclass="code-SummaryComment"><paramname="e"></param></span>'''<spanclass="code-SummaryComment"><remarks></remarks></span>PrivateSub UTConverter_KeyPress(ByVal sender _
 AsObject, ByVal e _
 As KeyPressEventArgs) _
 HandlesMyBase.KeyPress
 If (NotChar.IsDigit(e.KeyChar) And _
 NotChar.IsControl(e.KeyChar) And _
 e.KeyChar <> "-") Then e.Handled = TrueEndIfEndSub

只要用户退出。输入或者刷新文本框,接下来的代码就会重复调用以更新显示的值。

'''<spanclass="code-SummaryComment"><summary></span>''' Update the displayed value to show a date''' in lieu of a Unix time value whenever the''' leave event is fired.'''<spanclass="code-SummaryComment"></summary></span>'''<spanclass="code-SummaryComment"><paramname="sender"></param></span>'''<spanclass="code-SummaryComment"><paramname="e"></param></span>'''<spanclass="code-SummaryComment"><remarks></remarks></span>PrivateSub UTConverter_Leave(ByVal sender AsObject, ByVal e As 
 EventArgs) HandlesMyBase.Leave
 TryIf mCurrentDirection = Direction.ToDate Then ConvertToDateTime(Convert.ToDouble(Me.Text))
 Else ConvertToUnixTime(Convert.ToDateTime(Me.Text))
 EndIfCatch' do nothingEndTryEndSub'''<spanclass="code-SummaryComment"><summary></span>''' Update the displayed value to show a Unix''' time in lieu of a date whenever the enter''' event is fired.'''''' Disable this event handler if you do''' not want the time to convert back to''' Unix time''''''<spanclass="code-SummaryComment"></summary></span>'''<spanclass="code-SummaryComment"><paramname="sender"></param></span>'''<spanclass="code-SummaryComment"><paramname="e"></param></span>'''<spanclass="code-SummaryComment"><remarks></remarks></span>PrivateSub UTConverter_Enter(ByVal sender AsObject, ByVal e As 
 EventArgs) HandlesMyBase.Enter
 If ConvertOnClick = TrueThenTryIf mCurrentDirection = Direction.ToDate Then ConvertToUnixTime(Convert.ToDateTime(Me.Text))
 Else ConvertToDateTime(Convert.ToDouble(Me.Text))
 EndIfCatch' do nothingEndTryEndIfEndSub'''<spanclass="code-SummaryComment"><summary></span>''' Override the base refresh method''' to update the display of each value'''<spanclass="code-SummaryComment"></summary></span>'''<spanclass="code-SummaryComment"><remarks></remarks></span>PublicOverridesSub Refresh()
 MyBase.Refresh()
 ' convert to date whenever control' is refreshedTryIf mCurrentDirection = Direction.ToDate Then ConvertToDateTime(Convert.ToDouble(Me.Text))
 Else ConvertToUnixTime(Convert.ToDateTime(Me.Text))
 EndIfCatch' do nothingEndTryEndSub#End RegionEndClass

包装控件的内容。 下一节将讨论示范项目。

主窗体( 来自控件测试项目的form1.vb )

测试窗体包含自定义控件的八个实例;每个实例都用于显示不同的控件。 四个使用短日期字符串加载,四个用UNIX时间戳加载。 在两个组中,每个控件都设置了启用和禁用的ConvertOnClick 方法,并且 Direction 选项设置为 ToDate 或者 ToUnix。 在窗体中添加了一个工具提示,它被设置为描述当用户悬停在控件上时所选的每个选项。

表单的代码完整地显示在下面。 窗体加载事件处理程序中的代码被注释为描述每个节完成的内容。

PublicClass Form1
 PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As 
 System.EventArgs) HandlesMyBase.Load
 ' use negative numbers to express dates' prior to 1/1/1970' load with Unix time UtConverter1.Text = "-885772800"' a date prior to 1/1/1970 UtConverter2.Text = "849312000" UtConverter3.Text = "999648000" UtConverter4.Text = "4000000000"' load with normal dates UtConverter5.Text = "7/19/1960" UtConverter6.Text = "5/16/1933" UtConverter7.Text = "7/4/2008" UtConverter8.Text = "6/18/3100"' refresh all of the controls' to update the display UtConverter1.Refresh()
 UtConverter2.Refresh()
 UtConverter3.Refresh()
 UtConverter4.Refresh()
 UtConverter5.Refresh()
 UtConverter6.Refresh()
 UtConverter7.Refresh()
 UtConverter8.Refresh()
 ' move selection off custom controls button1.Select()
 EndSubPrivateSub button1_Click(ByVal sender As System.Object, ByVal e As 
 System.EventArgs) Handles button1.Click
 Application.Exit()
 EndSubEndClass

摘要

本文旨在描述自定义控件,该控件具有在UNIX时间戳格式和普通短日期字符串之间转换值的特殊目的。 这个项目是描述如何创建自定义控件的简单示例,可以使用类似的方法来使用现有控件。

历史记录

  • 第三方 2008年06月: 初始版本