5

我需要确定日历下拉列表当前是否显示在 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 状态?

4

2 回答 2

3

您所做的对于一次性实例来说很好,但是如果您的表单/类包含多个控件,那么使用变量跟踪它们可能会变得笨拙且难以遵循。

一种简单的替代方法是使用控件的.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 包含在你的项目中。

于 2012-05-25T11:42:45.147 回答
0

似乎没有更好的方法来实现这一点。当前的代码很好。

(只是发布这个答案来结束这个问题。我已经不再尝试建立在 DTP 类上。)

于 2012-06-11T18:37:56.960 回答