NumericUpDownコントロールを使用する機会は多いと思います。
ただこのNumericUpDown、1点残念な点がありまして。
ユーザー操作などで値が変化した際に、変更前の値を取得する方法が通常だと無いんですよね。
NumericUpDown 前回値と比較して処理分けをしたい場合は結構ある
前回値と比較して何か処理を分けたい、というシチュエーションは多々あるともいます。
例えば、以下のように何かの範囲を設定するような画面。最小値と最大値を設定する画面です。
ここで最小値または最大値が変更された場合に、「最小値≦最大値」となっているかなどをチェックしたい場合ってあると思います。
おそらく、「ValueChangedイベント」を拾ってそこで、「値チェック:最小値≦最大値」を行う場合が多いと思います。
このとき、ValueChangedイベントで、e.OldValueなんてプロパティがあれば非常に便利なのですが残念ながらありません。
というわけで、こんな時に使える、NumericUpDownの前回値(OldValue)の保持について紹介したいと思います。
NumericUpDown 前回値(OldValue)を保持して参照する方法①
まず1つ目です。
※これはおそらく誰でも思いつくと思いますが、一応書きます。
前回値(OldValue)を保持するためのフィールドを追加する
こんな感じで前回値を保持するための変数(フィールド)を準備します。
1 | private int _oldValue; |
そして、NumericUpDownのValueChangedイベントハンドラで以下のような値チェックをし、そこで利用しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | private void numericUpDownMin_ValueChanged(object sender, EventArgs e) { // 最小値設定用のNumericUpDownの値が変化した時にイベントが発生。 if (this.numericUpDownMax.Value < this.numericUpDownMin.Value) { // 「最大値 < 最小値」となった場合ここを通る。 // 変更をキャンセルしたいので、最小値を前回値に戻す。 this.numericUpDownMax.Value = this._oldValue; } else { // 前回値を現在の値に書き換える。 this._oldValue = (int)this.numericUpDownMax.Value; } } |
設定範囲が、最大値<最小値と逆転してしまった場合に入力をキャンセル(無効)にしたいので、保持していた前回値に戻しています。
まぁ単純で簡単ですが、NumericUpDownコントローラーの数分フィールドを追加しなければいけないのでちょっと面倒という欠点もあります。
また、初期値が何も設定しないと、intで宣言しているこの場合はゼロとなることも注意が必要です。
ちゃんと初期値設定も忘れずに行う必要があります。
NumericUpDown 前回値(OldValue)を保持して参照する方法②
先ほどのフィールド追加よりも、もっとシンプルな方法を紹介します。
NumericUpDownのプロパティ「Tag」を使用する方法
NumericUpDownにあるTagというプロパティを使用します。
以下のような使い方ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | private void numericUpDownMin_ValueChanged(object sender, EventArgs e) { // 最小値設定用のNumericUpDownの値が変化した時にイベントが発生。 if (this.numericUpDownMax.Value < this.numericUpDownMin.Value) { // 「最大値 < 最小値」となった場合ここを通る。 // 変更をキャンセルしたいので、最小値を前回値に戻す。 if (this.numericUpDownMin.Tag != null) { // Tagの初期値はnullなので注意 this.numericUpDownMax.Value = (int)this.numericUpDownMin.Tag; } } else { // 前回値を現在の値に書き換える。 this.numericUpDownMin.Tag = (int)this.numericUpDownMax.Value; } } |
NumericUpDownのTagに前回値を保持して使うような感じです。
ただし、このTagの初期値はnullになっているので注意が必要です。
先ほどのフィールド追加と同じようにあらかじめ初期値を設定しておく必要があります。またTagにアクセスする際はnullチェックを行うなど必要です。
まとめ
NumericUpDownの前回値(OldValue)を保持し参照する方法。
- 前回値保持用にフィールドを追加し地道に頑張る
- NumericUpDownのTagを使う(初期値がnullであることに注意)