数値コントロールでは、入力可能な範囲を指定したりマイナス値を制御することができます。ここでは数値コントロールが提供する入力機能について解説します。
数値コントロールでは書式設定により、数値の入力および表示書式を自由に設定することができます。入力書式は、コントロールが入力フォーカスを受け取ったときの書式で、表示書式は入力フォーカスのないときの書式です。
入力書式の設定は、Fields プロパティによって行われ、フィールドとよばれる入力領域を構成する要素によって定義されます。また、表示書式は、DisplayFields プロパティによって行われ、Fields プロパティと同様フィールドによって定義します。 Fields プロパティおよび DisplayFields プロパティの詳細や書式の設定方法については、「書式の設定」で詳しく解説します。
数値コントロールで入力可能な範囲の指定を指定するには、コントロールのプロパティを使用する方法と、数値検証コンポーネントを使用する方法があります。
コントロールのMaxValue プロパティとMinValue プロパティを設定してコントロールに入力可能な範囲を指定することができます。
これらのプロパティを使用する場合、検証は入力中のリアルタイムに行われます。全てのフィールドの値が入力されると検証が行われ、範囲外の値の場合にはMaxMinBehavior プロパティの設定によって値が制御されます。MaxMinBehavior プロパティに設定できる値は以下のとおりで、既定値はMaxMinBehavior.AdjustToMaxMin です。
MaxMinBehaviorの値 | 説明 |
---|---|
AdjustToMaxMin | 値を最小値か最大値の近い方に設定します。 |
Clear | 値を削除してnullにします。 |
Restore | 変更前の値に戻します。 |
CancelInput | 最後の入力をキャンセルしてフォーカスを保持します。 |
Keep | エラーとなったTextプロパティの値を保持します。 |
MaxMinBehavior プロパティをMaxMinBehavior.CancelInput に設定した場合、範囲外の値の最後の入力を行った時点でInvalidInput イベントが発生します。 InvalidInputイベント側では入力された値が範囲外であることを取得できるため、メッセージを出力するなどのカスタマイズが可能です。
以下のサンプルコードは、範囲外の値が入力されたとき、メッセージボックスを表示する例です。
Imports GrapeCity.Win.Editors Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' 最大値と最小値を設定します。 GcNumber1.MaxValue = 100 GcNumber1.MinValue = 0 ' 範囲外の場合に値をどのように制御するかを設定します。 GcNumber1.MaxMinBehavior = MaxMinBehavior.CancelInput End Sub Private Sub GcNumber1_InvalidInput(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GcNumber1.InvalidInput Dim InvalidInputEventArgs As InvalidInputEventArgs = TryCast(e, InvalidInputEventArgs) If InvalidInputEventArgs Is Nothing Then Exit Sub End If ' 値が範囲外の場合には、メッセージを表示します。 If InvalidInputEventArgs.ValueOutOfRange Then MessageBox.Show("範囲外の値です。") End If End Sub
using GrapeCity.Win.Editors; private void Form1_Load(object sender, EventArgs e) { // 最大値と最小値を設定します。 gcNumber1.MaxValue = 100; gcNumber1.MinValue = 0; // 範囲外の場合に値をどのように制御するかを設定します。 gcNumber1.MaxMinBehavior = MaxMinBehavior.CancelInput; } private void gcNumber1_InvalidInput(object sender, EventArgs e) { InvalidInputEventArgs invalidInputEventArgs = e as InvalidInputEventArgs; if (invalidInputEventArgs == null) { return; } // 値が範囲外の場合には、メッセージを表示します。 if (invalidInputEventArgs.ValueOutOfRange) { MessageBox.Show("範囲外の値です。"); } }
数値コントロールの場合、日付時刻コントロールやタイムスパンコントロールと異なり『入力の途中かどうか』の判断が難しいケースがあります。
例えば、入力範囲を50から100に設定した場合、「6」が入力された時点では「60」と入力する途中の段階であるのか、「6」で確定なのかを判断することができません。こういったケースではフォーカスを移動するタイミングで検証を行い、範囲外のままフォーカスを移動しようとしている場合にはMaxMinBehavior プロパティの設定によって値を制御します。
ただし、上記のケースでMaxMinBehavior プロパティをMaxMinBehavior.CancelInput に設定している場合、フォーカス移動のタイミングではInvalidInput イベントは発生せず、フォーカスの保持だけが行われます。これは、InvalidInput イベントは無効な文字が入力されたときに発生するイベントであるため、Tabキー押下などによるフォーカス移動はそれに該当しないためです。
数値検証コンポーネントを使用して、数値コントロールに入力可能な範囲を指定することができます。検証コンポーネントを利用した場合、範囲外のときに値の制御を行うだけではなく、エラーアイコンを表示したり背景色を変更したりと柔軟なエラー通知機能を利用することが可能です。
検証コンポーネントを利用して入力範囲の検証を行う場合には、以下のいずれかの設定を行う必要があります。
この設定を行わない場合、数値コントロールの入力中に行う検証機能が動作し、検証コンポーネントによる検証が行われません。
数値検証コンポーネントを利用して入力可能な範囲を設定するには、GcNumberValidator.InvalidRange クラスを使用し、GcNumberValidator.InvalidRange クラスのMaxValue およびMinValue プロパティで、最大値および最小値を指定します。
数値検証コンポーネントを使用した範囲設定やエラー通知の詳細については「検証コンポーネント」を参照してください。
RoundPattern プロパティを使用すると、設定した書式に対して端数処理の詳細な設定ができます。RoundPattern プロパティに設定できる値は次の通りで、既定値は四捨五入(RoundPattern.MidpointRoundAwayFromZero)です。
プロパティ値 | 説明 |
---|---|
Ceiling | 切り上げ(大きいほうの近似値への丸め) |
Floor | 切り捨て(小さいほうの近似値への丸め) |
MidpointRoundAwayFromZero | 四捨五入 |
MidpointRoundToEven | 近似値への丸め(偶数丸め、銀行丸め) |
RoundDown | 切り捨て |
RoundUp | 切り上げ |
Value プロパティは設定された書式に沿ってRoundPattern プロパティで設定された端数処理後の値を保持します。データベースなどから取得した値を設定する際の端数処理などに有効です。
GcNumber1.Fields.SetFields("##,###.##,,,-,")
GcNumber1.RoundPattern = GrapeCity.Win.Editors.RoundPattern.Ceiling
GcNumber1.Value = Convert.ToDecimal(98765.4321)
gcNumber1.Fields.SetFields("##,###.##,,,-,");
gcNumber1.RoundPattern = GrapeCity.Win.Editors.RoundPattern.Ceiling;
gcNumber1.Value = Convert.ToDecimal(98765.4321);
(図)実行結果
また、入力書式と表示書式が異なる場合にも、設定した端数処理が有効になります。
GcNumber1.Fields.SetFields("##,###.##,,,-,") GcNumber1.DisplayFields.Clear() GcNumber1.DisplayFields.AddRange("##,###.#,,,-,") GcNumber1.RoundPattern = GrapeCity.Win.Editors.RoundPattern.Floor GcNumber1.Value = Convert.ToDecimal(12345.67)
gcNumber1.Fields.SetFields("##,###.##,,,-,"); gcNumber1.DisplayFields.Clear(); gcNumber1.DisplayFields.AddRange("##,###.#,,,-,"); gcNumber1.RoundPattern = GrapeCity.Win.Editors.RoundPattern.Floor; gcNumber1.Value = Convert.ToDecimal(12345.67);
(図)実行結果
コントロールの入力をプラスの値かマイナスの値のいずれかのみを許可したい場合、ValueSign プロパティを設定します。
プロパティ値 | 説明 |
---|---|
NoControl | 数値の符号が設定されていません。正数、負数両方の入力を許可します。 |
Positive | 正数の入力のみを許可します。 |
Negative | 負数の入力のみを許可します。 |
マイナス値が入力されたとき、書式の設定で表示する文字列を指定することが可能ですが、NegativeColor プロパティを使用すれば、マイナス値が入力された場合の文字色を設定することができます。また、UseNegativeColor プロパティで、指定した色を適用するかどうかを設定します。
(図) マイナス値の書式と色を設定した数値コントロール
マイナスキーは値をプラスとマイナスを切り替えるスイッチ機能を行います。(1回目のマイナスキー押下で値がマイナスに変化、2回目押下でプラスに変化) この動作は、数値コントロールに以下のショートカット機能が設定されていることで実現されています。
この動作を、マイナスキーが押下された場合には値をマイナスに変更するだけの動作とさせることもできます。(1回目のマイナスキー押下で値がマイナスに変化、2回目押下でもマイナスのまま。プラスにしたい場合はプラスキーを押下する)
既定の動作から新しい動作に変更するためには、上記で挙げたふたつのショートカット機能を削除します。
' キー:OemMinusとSubtractに設定しているショートカット機能を削除します。
GcShortcut1.GetShortcuts(GcNumber1).Remove(Keys.OemMinus)
GcShortcut1.GetShortcuts(GcNumber1).Remove(Keys.Subtract)
// キー:OemMinusとSubtractに設定しているショートカット機能を削除します。
gcShortcut1.GetShortcuts(gcNumber1).Remove(Keys.OemMinus);
gcShortcut1.GetShortcuts(gcNumber1).Remove(Keys.Subtract);
Value プロパティを使えば、リテラル文字列を除いたコントロール内の数値をDecimal型で取得または設定できます。たとえば、Text プロパティに「\ 50,000.-」が設定されているときには、Value プロパティの値は「50000」となります。
Value プロパティが変更されると、その変更はDisplayText プロパティとText プロパティにも適用されます。
クリップボードにリテラル文字を含まない値を渡すには、ClipContent プロパティとSelectedText プロパティを使用します。ClipContent プロパティで制御できるのは、SelectedText プロパティの値のみなので、以下のプロパティの値をクリップボードに設定した場合は、ClipContent プロパティの設定は無効になります。
次のサンプルコードは、ClipContent プロパティを使って、リテラル文字列を省いた文字列をクリップボードにコピーする方法を示します。
Imports GrapeCity.Win.Editors ' コントロールに値を設定して、クリップボードにコピーします。 GcNumber1.Fields.SignPrefix.PositivePattern = "\" GcNumber1.Fields.SignPrefix.NegativePattern = "\-" GcNumber1.Value = 10000 GcNumber1.ClipContent = ClipContent.ExcludeLiterals GcNumber1.SelectionStart = 0 GcNumber1.SelectionLength = GcNumber1.Text.Length Clipboard.SetDataObject(GcNumber1.SelectedText) ' クリップボードのデータを取得して確認します。 Dim cbData As IDataObject = Clipboard.GetDataObject() Label1.Text = cbData.GetData(DataFormats.Text)
using GrapeCity.Win.Editors; // コントロールに値を設定して、クリップボードにコピーします。 gcNumber1.Fields.SignPrefix.PositivePattern = "\\"; gcNumber1.Fields.SignPrefix.NegativePattern = "\\-"; gcNumber1.Value = 10000; gcNumber1.ClipContent = ClipContent.ExcludeLiterals; gcNumber1.SelectionStart = 0; gcNumber1.SelectionLength = gcNumber1.Text.Length; Clipboard.SetDataObject(gcNumber1.SelectedText); // クリップボードのデータを取得して確認します。 IDataObject cbData = Clipboard.GetDataObject(); label1.Text = cbData.GetData(DataFormats.Text).ToString();
数値コントロールで、ゼロを削除し値をNullとすることができるかどうかは、 AllowDeleteToNull プロパティで設定します。
AllowDeleteToNull プロパティをTrueに設定することで、入力された「0」をDelete キーやBackSpace キーで削除し、そのValue プロパティをNullにすることができます。
入力書式の設定で小数の入力を許可しない場合、小数点が含まれた数値がクリップボードから貼り付けられたときの入力値をAcceptsDecimal プロパティを使用して制御することができます。既定値はDecimalMode.Cut です。
AcceptsDecimalの値 | 説明 |
---|---|
Cut | 小数点以下が切り捨てられます。「123.45」という数値が「123」として入力されます。 |
Filter | 小数点が削除されます。「123.45」という数値が「12345」として入力されます。 |
AcceptsCrLf プロパティを使用してクリップボードへ改行を含む文字列をコピー、または貼り付けた場合の改行コードの扱いを設定できます。 AcceptsCrLf プロパティは、CrLfMode 列挙体を使用して次の値を設定できます。
AcceptsCrLfの値 | 説明 |
---|---|
NoControl | 改行コードはそのままでコピー、貼り付けを行います。従来のInputManの数値コントロールと同じ動作です。 |
Filter | 全ての改行コードを削除しコピー、貼り付けを行います。 |
Cut | 最初の改行コード以降の文字列を削除します。標準コントロールと同じ動作です。 |
コントロールに文字列を入力するとTextChanging イベントが、TextChanged イベントの前(入力された文字列がText プロパティに渡される前)に発生します。そのため、このイベント内で入力文字列をチェックすれば、Text プロパティの値に影響を与えることなく、入力を制御できます。