我需要确定日历下拉列表当前是否显示在WinForms DateTimePicker中。我有一个继承自DateTimePicker的自定义控件,我正在处理KeyDown事件以便使用导航键执行操作,但是如果日历下拉列表打开,我想绕过该代码,以便用户可以在那里使用他们的导航键。
使用ComboBox控件,可以很容易地使用.DroppedDown
属性来检查它是否打开,但DateTimePicker没有这样的属性。
我目前正在做以下事情:
Private _isDroppedDown As Boolean = False
Private Sub MyDateTimePicker_CloseUp(sender As Object, e As EventArgs) Handles Me.CloseUp
_isDroppedDown = False
End Sub
Private Sub MyDateTimePicker_DropDown(sender As Object, e As EventArgs) Handles Me.DropDown
_isDroppedDown = True
End Sub
但是,我想知道是否有更好的方法来获取控件的DroppedDown状态,而不是使用变量手动跟踪它?
答案 0 :(得分:2)
对于一次性实例,您所做的一切都很好,但如果您的表单/类包含多个控件,那么使用变量跟踪它们 all 可能会变得难以理解且难以理解。
一种简单的替代方法是使用控件的.Tag
属性来记录变量状态并对其进行测试。但是,更好的方法是创建自己的类来继承控件并添加所需的属性,几乎使用您已有的相同代码。因此,在您的情况下,您将使用以下代码添加名为“MyDateTimePicker”的类:
Public Class MyDateTimePicker
Inherits DateTimePicker
Dim _isDroppedDown As Boolean = False
Public Property IsDroppedDown() As Boolean
Get
IsDroppedDown = _isDroppedDown
End Get
Set(value As Boolean)
_isDroppedDown = value
End Set
End Property
Private Sub MyDateTimePicker_CloseUp(sender As Object, e As System.EventArgs) Handles Me.CloseUp
_isDroppedDown = False
End Sub
Private Sub MyDateTimePicker_DropDown(sender As Object, e As System.EventArgs) Handles Me.DropDown
_isDroppedDown = True
End Sub
End Class
在下一次构建之后,新的MyDateTimePicker类应该出现在项目的“组件”选项卡下的工具箱中。它将包含与DateTimePickers相关的所有常见事件,方法和属性,以及新的.IsDroppedDown
属性。
哦,如果你经常使用它,你可以创建它作为一个新的类库,只需包含它在你的项目中构建的DLL。
答案 1 :(得分:0)
似乎没有更好的方法来实现这一目标;目前的代码很好。
(只是发布这个答案来解决这个问题。我已经开始尝试在DTP课程上构建。)