本記事はこんな方におすすめです
- 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
using System;
using System.Windows.Forms;
public class ExtendedNumericUpDown : NumericUpDown {
public class UpDownEventArgs : EventArgs {
private bool handled = false;
private readonly bool up;
internal UpDownEventArgs(bool up) {
this.up = up;
}
public bool Handled {
get {return handled;}
set {handled = value;}
}
public bool Up {
get {return up;}
}
}
public delegate void UpDownEventHandler(
object sender, UpDownEventArgs e);
public event UpDownEventHandler UpDown;
public override void DownButton() {
UpDownEventArgs e = new UpDownEventArgs(false);
if (UpDown != null)
UpDown(this, e);
if (!e.Handled)
base.DownButton();
}
public override void UpButton() {
UpDownEventArgs e = new UpDownEventArgs(true);
if (UpDown != null)
UpDown(this, e);
if (!e.Handled)
base.UpButton();
}
}
これで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
private void ExtendedNumericUpDown1_UpDown(object sender, ExtendedNumericUpDown.UpDownEventArgs e)
{
if (e.Up)
{
// UPが押された場合
}
else
{
// DOWNが押された場合
}
}
これでUP/DOWNが判別できるNumericUpDownコントロール環境の出来上がりです。
まとめ
今回は「Excel VBAだったら出来たのに!」という事例でしたが、実際は逆の方が多いですね。
NumericUpDownコントロールに関しては、本記事のような対応をすることでUP/DOWNの判別ができるようになりました。
(実際は、UpDownイベントとValueChangedイベントの処理フロー作りこみがまた悩ましいところですけどね。。)
ぜひ、派生クラスを作成して独自イベントの追加が可能であることを踏まえて、今後のプログラミングに役立てて頂ければ幸いです。