NumericUpDownコントロールは数値を扱うときに便利ですが、初期状態ではMaximum = 100、Minimum = 0となっています。なにか値を表示させるときにこれを超えてしまうと例外発生となります。
こんなプログラムを書くと例外が発生します。
1 2 3 4 5 6 7 8 9 10 11 12 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { numericUpDown1.Value = 300; } } |
上限下限が決まっている値を設定したいときには便利ですが、取得した値を表示する場合は使いにくいので自作してみます。
簡単な説明
NumericUpDownコントロールのValueプロパティはdecimal型(int型やlong型よりも大きな値を扱うことができる)のですが、これまでNumericUpDownコントロールを使ってきた経験上、int型で十分であると思います。取得した値をint型にキャストするのが面倒なので、int型で設定できるようにします。
Valueプロパティ
Maximumプロパティで設定されている値よりも大きな値やMinimumプロパティで設定されている値よりも小さな値をValueプロパティにセットしようとした場合はそのつどMaximumプロパティとMinimumプロパティに設定されている値を変更しています。
TextChangedイベント
NumericUpDownコントロールに直接値を入力したときにMaximumプロパティとMinimumプロパティに設定されている値の範囲内でないと値が有効になりませんが、これも対応できるようにします。
NumericUpDownコントロールには Text プロパティという非表示なプロパティがあります。またTextChanged イベントもあります。TextChangedイベントのあとテキストボックスの値が適切なものであればValueChangedイベントも発生します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
public class NumericUpDownEx : NumericUpDown { public NumericUpDownEx() { } new public int Value { get { return (int)base.Value; } set { if(Maximum < value) Maximum = value; if(Minimum > value) Minimum = value; base.Value = value; } } protected override void OnTextChanged(EventArgs e) { string text = Text; try { // Textが変更された場合で Valueと異なる場合は新しい文字列を整数に変換してこれを表示する int i = int.Parse(text); if(Value != i) Value = i; } catch { // 不適切な文字列が入力された場合ははじめに表示されていた値を表示する Value = Value; } } } |
使用例
[サイズ取得]をクリックするとフォームのサイズを取得することができます。NumericUpDownコントロールの値を変更して[サイズ変更]をクリックするとフォームが指定されたサイズに変更されます。ただ10000のような極端に大きな値にしてもフォームの大きさには上限があるため、どこまでも大きなサイズに変更することはできません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void buttonGetSize_Click(object sender, EventArgs e) { numericUpDownEx1.Value = this.Size.Width; numericUpDownEx2.Value = this.Size.Height; } private void buttonSetSize_Click(object sender, EventArgs e) { int width = numericUpDownEx1.Value; int height = numericUpDownEx2.Value; this.Size = new Size(width, height); } } |