5

カレンダーのドロップダウンが現在WinFormsDateTimePickerに表示されているかどうかを確認する必要があります。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

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をプロジェクトに含めるだけで済みます。

于 2012-05-25T11:42:45.147 に答える
0

これを達成するためのより良い方法はないようです。現在のコードは問題ありません。

(質問を閉じるためにこの回答を投稿するだけです。それ以来、DTPクラスを構築する試みから移動しました。)

于 2012-06-11T18:37:56.960 に答える