【问题标题】:How can I retrieve the dropdown state of a DateTimePicker?如何检索 DateTimePicker 的下拉状态?
【发布时间】:2012-05-24 19:49:21
【问题描述】:

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

【问题讨论】:

  • DTP 有点蹩脚,你现在的没毛病。
  • 它有效,但不太优雅。事实证明,Windows DTP 的其他限制也给我带来了问题,所以我将自己推出。
  • 请写下这个作为答案,汉斯,我会接受的。

标签: .net vb.net winforms datetimepicker


【解决方案1】:

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

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

【讨论】:

  • 这正是我现在正在做的事情,我只是想知道是否有一种方法可以在不使用内部变量的情况下获取状态。
  • 抱歉,我显然错过了您的 OP 中提到它是从 DTP 继承的自定义控件的部分——这将教会我以后更仔细地阅读问题。那么无论如何,你不喜欢这种方法是什么?诚然,如果 DTP 已经内置了这样的属性会更好,但既然没有,这似乎是最好的解决方法。在我看来,这当然比深入研究子类等要好。
  • 我只是想确保在某个地方没有某种子属性,我可以在不自己跟踪的情况下检索信息。事实上,由于 DTP 的一些其他限制,我现在正在考虑将我的课程基于 TextBox。
  • @MCattle 够公平的。我必须承认,我发现标准 .NET 日期控件的缺点非常令人沮丧。我曾经玩弄过在 WinForms 应用程序中使用 WPF 日历控件的想法,但遗憾的是,它与 WinForms MonthCalendar 控件一样受到问题(尽管不同的问题)的束缚。 MS 在制作日期/时间控件方面似乎与制作滚动条一样糟糕!
  • 这个答案非常方便:只需将代码粘贴到自定义控制器中,然后替换您之前的调用。谢谢伙计,详细说明 OP 代码。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 2012-01-03
    • 1970-01-01
    相关资源
    最近更新 更多