VB/C#

【VB/C#】NumericUpDownコントロールでUP/DOWNを判別する

本記事はこんな方におすすめです

  • NumericUpDownコントロールでUP/DOWNを判別したい

NumericUpDownコントロールとは

NumericUpDownコントロールは、Windowsフォームアプリケーションで使用されるコントロールの1つです。

上下のボタンをクリックして数値を増減させることができ、このコントロールにはValueプロパティがあり、このプロパティを使用してコントロールに表示される数値を設定または取得することができます。

【NumericUpDownコントロール】

Excel VBAにも同じ機能として使える「SpinButton」が存在します。

使い勝手はほとんど変わりませんが、SpinButtonにはあってNumericUpDownには無いもの、それが・・・

Up, Downイベントが無い。。。。。

よしこた

NumericUpDownの派生クラス作成

という事で、UP/DOWNのどちらが押されたかどうかを判別する為に必要な準備を行います。

まず見出しにある通り、NumericUpDownの派生クラスを作成します。

<<サンプルコード>>

Imports System.Windows.Forms

Public Class ExtendedNumericUpDown
    Inherits NumericUpDown

    Public Class UpDownEventArgs
        Inherits EventArgs

        Private m_Handled As Boolean = False
        Private m_Up As Boolean = False

        Friend Sub New(ByVal up As Boolean)
            Me.m_Up = up
        End Sub

        Public Property Handled() As Boolean
            Get
                Return m_Handled
            End Get
            Set(ByVal value As Boolean)
                m_Handled = value
            End Set
        End Property

        Public ReadOnly Property Up() As Boolean
            Get
                Return m_Up
            End Get
        End Property

    End Class

    Public Delegate Sub UpDownEventHandler(ByVal sender As Object, ByVal e As UpDownEventArgs)

    Public Event UpDown As UpDownEventHandler

    Public Overrides Sub DownButton()
        Dim e As New UpDownEventArgs(False)
        If Not (UpDownEvent Is Nothing) Then
            RaiseEvent UpDown(Me, e)
        End If

        If Not e.Handled Then
            MyBase.DownButton()
        End If
    End Sub

    Public Overrides Sub UpButton()
        Dim e As New UpDownEventArgs(True)
        If Not (UpDownEvent Is Nothing) Then
            RaiseEvent UpDown(Me, e)
        End If

        If Not e.Handled Then
            MyBase.UpButton()
        End If
    End Sub

End Class

これでUpDownイベントを備えたコントロール、「ExtendedNumericUpDown 」が使用可能になりました。

Up/Downを判別する

早速、先述で作成したExtendedNumericUpDownコントロールを実際にフォームに配置してみましょう。

見栄えはもちろん、機能的な点も普通のNumericUpDownコントロールと変わりありません。

UpDownイベントが増えていますね。それではイベントを作成していきます。

<<サンプルコード>>

Private Sub ExtendedNumericUpDown1_UpDown(sender As Object, e As ExtendedNumericUpDown.UpDownEventArgs) Handles ExtendedNumericUpDown1.UpDown

    If e.Up Then
        'UPが押された場合

    Else
        'DOWNが押された場合

    End If

End Sub

これでUP/DOWNが判別できるNumericUpDownコントロール環境の出来上がりです。

まとめ

今回は「Excel VBAだったら出来たのに!」という事例でしたが、実際は逆の方が多いですね。

NumericUpDownコントロールに関しては、本記事のような対応をすることでUP/DOWNの判別ができるようになりました。

(実際は、UpDownイベントとValueChangedイベントの処理フロー作りこみがまた悩ましいところですけどね。。)

よしこた

ぜひ、派生クラスを作成して独自イベントの追加が可能であることを踏まえて、今後のプログラミングに役立てて頂ければ幸いです。

  • この記事を書いた人

よしこた

1992年生まれの牡羊座。
大学卒業後は地元の中小企業に就職し、
1年後にIT部門を立ち上げ、ITコンサルティング事業を始める。
クラウドソーシングをしつつ、ビギナー目線で記事を執筆します。

服やアニメが好き。仕事も割と好き。

-VB/C#