GcNumberCellでは、入力可能な範囲を指定したりマイナス値を制御することができます。ここではGcNumberCellが提供する入力機能について解説します。
GcNumberCellでは書式設定により、数値の入力および表示書式を自由に設定することができます。入力書式は、セルが入力フォーカスを受け取ったときの書式で、表示書式は入力フォーカスのないときの書式です。
入力書式の設定は、Fieldsプロパティによって行われ、フィールドとよばれる入力領域を構成する要素によって定義されます。また、表示書式は、DisplayFieldsプロパティによって行われ、Fieldsプロパティと同様フィールドによって定義します。FieldsプロパティおよびDisplayFieldsプロパティについては、「書式の設定」で詳しく解説します。
セルのMaxValueプロパティとMinValueプロパティを設定してセルに入力可能な範囲を指定します。
これらのプロパティを使用する場合、検証は入力中のリアルタイムに行われます。全てのフィールドの値が入力されると検証が行われ、範囲外の値の場合にはMaxMinBehaviorプロパティの設定によって値が制御されます。MaxMinBehaviorプロパティに設定できる値は以下のとおりで、既定値はMaxMinBehavior.AdjustToMaxMinです。
MaxMinBehaviorの値 | 説明 |
---|---|
AdjustToMaxMin | 値を最小値か最大値の近い方に設定します。 |
Clear | 値を削除してnullにします。 |
Restore | 変更前の値に戻します。 |
CancelInput | 最後の入力をキャンセルしてフォーカスを保持します。 |
Keep | エラーとなったTextプロパティの値を保持します。 |
MaxMinBehaviorプロパティをMaxMinBehavior.CancelInputに設定した場合、範囲外の最後の入力を行った時点でGcNumberEditingControl.InvalidInputイベントが発生します。InvalidInputイベント側では入力された値が範囲外であることを取得できるため、メッセージを出力するなどのカスタマイズが可能です。
以下のサンプルコードは、範囲外の値が入力されたとき、メッセージボックスを表示する例です。
Imports GrapeCity.Win.MultiRow Imports InputManCell = GrapeCity.Win.MultiRow.InputMan Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Dim GcNumberCell1 As New InputManCell.GcNumberCell() ' 最大値と最小値を設定します。 GcNumberCell1.MaxValue = 100 GcNumberCell1.MinValue = 0 ' 範囲外の場合に値をどのように制御するかを設定します。 GcNumberCell1.MaxMinBehavior = GrapeCity.Win.Editors.MaxMinBehavior.CancelInput GcMultiRow1.Template = Template.CreateGridTemplate(New Cell() {GcNumberCell1}) End Sub Private Sub GcMultiRow1_EditingControlShowing(sender As Object, e As EditingControlShowingEventArgs) Handles GcMultiRow1.EditingControlShowing If (TypeOf (e.Control) Is InputManCell.GcNumberEditingControl) Then Dim editor As InputManCell.GcNumberEditingControl = DirectCast(e.Control, InputManCell.GcNumberEditingControl) RemoveHandler editor.InvalidInput, AddressOf editor_InvalidInput AddHandler editor.InvalidInput, AddressOf editor_InvalidInput End If End Sub Private Sub editor_InvalidInput(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim InvalidInputEventArgs As GrapeCity.Win.Editors.InvalidInputEventArgs = TryCast(e, GrapeCity.Win.Editors.InvalidInputEventArgs) If InvalidInputEventArgs Is Nothing Then Exit Sub End If ' 値が範囲外の場合には、メッセージを表示します。 If InvalidInputEventArgs.ValueOutOfRange Then MessageBox.Show("範囲外の値です。") End If End Sub
using GrapeCity.Win.MultiRow; using InputManCell = GrapeCity.Win.MultiRow.InputMan; private void Form1_Load(object sender, EventArgs e) { InputManCell.GcNumberCell gcNumberCell1 = new InputManCell.GcNumberCell(); // 最大値と最小値を設定します。 gcNumberCell1.MaxValue = 100; gcNumberCell1.MinValue = 0; // 範囲外の場合に値をどのように制御するかを設定します。 gcNumberCell1.MaxMinBehavior = GrapeCity.Win.Editors.MaxMinBehavior.CancelInput; gcMultiRow1.Template = Template.CreateGridTemplate(new Cell[] { gcNumberCell1 }); gcMultiRow1.EditingControlShowing += new EventHandler<EditingControlShowingEventArgs>(gcMultiRow1_EditingControlShowing); } private void gcMultiRow1_EditingControlShowing(object sender, EditingControlShowingEventArgs e) { if (e.Control is InputManCell.GcNumberEditingControl) { InputManCell.GcNumberEditingControl editor = (InputManCell.GcNumberEditingControl)e.Control; editor.InvalidInput -= new EventHandler(editor_InvalidInput); editor.InvalidInput += new EventHandler(editor_InvalidInput); } } private void editor_InvalidInput(object sender, EventArgs e) { GrapeCity.Win.Editors.InvalidInputEventArgs invalidInputEventArgs = e as GrapeCity.Win.Editors.InvalidInputEventArgs; if (invalidInputEventArgs == null) { return; } // 値が範囲外の場合には、メッセージを表示します。 if (invalidInputEventArgs.ValueOutOfRange) { MessageBox.Show("範囲外の値です。"); } }
GcNumberCellの場合、GcDateTimeCellやGcTimeSpanCellと異なり『入力の途中かどうか』の判断が難しいケースがあります。
例えば、入力範囲を50から100に設定した場合、「6」が入力された時点では「60」と入力する途中の段階であるのか、「6」で確定なのかを判断することができません。こういったケースではセルの値を確定するタイミングで検証を行い、範囲外のまま値を確定しようとしている場合、ArgumentOutOfRangeExceptionが発生します。この例外によるメッセージボックスの表示を抑制するには、GcMultiRow.DataErrorイベント を使用します。
RoundPatternプロパティを使用すると、設定した書式に対して端数処理の詳細な設定ができます。RoundPatternプロパティに設定できる値は次の通りで、既定値は四捨五入(RoundPattern.MidpointRoundAwayFromZero)です。
プロパティ値 | 説明 |
---|---|
Ceiling | 切り上げ |
Floor | 切り捨て |
MidpointRoundAwayFromZero | 四捨五入 |
MidpointRoundToEven | 近似値への丸め(偶数丸め、銀行丸め) |
セルの入力をプラスの値かマイナスの値のいずれかのみを許可したい場合、ValueSignプロパティを設定します。
プロパティ値 | 説明 |
---|---|
NoControl | 数値の符号が設定されていません。正数、負数両方の入力を許可します。 |
Positive | 正数の入力のみを許可します。 |
Negative | 負数の入力のみを許可します。 |
マイナス値が入力されたとき、書式の設定で表示する文字列を指定することが可能ですが、NegativeColorプロパティを使用すれば、マイナス値が入力された場合の文字色を設定することができます。また、UseNegativeColorプロパティで、指定した色を適用するかどうかを設定します。
(図) マイナス値の書式と色を設定したGcNumberCell
マイナスキーは値をプラスとマイナスを切り替えるスイッチ機能を行います。(1回目のマイナスキー押下で値がマイナスに変化、2回目押下でプラスに変化) この動作は、GcNumberCellに以下のショートカット機能が設定されていることで実現されています。
この動作を、マイナスキーが押下された場合には値をマイナスに変更するだけの動作とさせることもできます。(1回目のマイナスキー押下で値がマイナスに変化、2回目押下でもマイナスのまま。プラスにしたい場合はプラスキーを押下する)
既定の動作から新しい動作に変更するためには、上記で挙げたふたつのショートカット機能を削除します。
Valueプロパティを使えば、リテラル文字列を除いたセル内の数値をDecimal型で取得または設定できます。
クリップボードにリテラル文字を含まない値を渡すには、ClipContentプロパティとGcNumberEditingControl.SelectedTextプロパティを使用します。ClipContentプロパティで制御できるのは、SelectedTextプロパティの値のみなので、以下のプロパティの値をクリップボードに設定した場合は、ClipContentプロパティの設定は無効になります。
次のサンプルコードは、ClipContentプロパティを使って、リテラル文字列を省いた文字列をクリップボードにコピーする方法を示します。
Imports GrapeCity.Win.MultiRow Imports InputManCell = GrapeCity.Win.MultiRow.InputMan Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim GcNumberCell1 = New InputManCell.GcNumberCell() ' セルに値を設定します。 GcNumberCell1.Fields.SignPrefix.PositivePattern = "\" GcNumberCell1.Fields.SignPrefix.NegativePattern = "\-" GcNumberCell1.Value = 10000 GcNumberCell1.ClipContent = GrapeCity.Win.Editors.ClipContent.ExcludeLiterals Dim TextBoxCell1 As New TextBoxCell() ' MultiRowのテンプレートを設定します。 GcMultiRow1.Template = Template.CreateGridTemplate(New Cell() {GcNumberCell1, TextBoxCell1}) GcMultiRow1.RowCount = 5 End Sub Private Sub GcMultiRow1_EditingControlShowing(ByVal sender As Object, ByVal e As EditingControlShowingEventArgs) Handles GcMultiRow1.EditingControlShowing If TypeOf e.Control Is InputManCell.GcNumberEditingControl Then ' GcNumberCellの編集用コントロールが表示された場合にKeyDownイベントを設定します。 RemoveHandler e.Control.KeyDown, AddressOf Editor_KeyDown AddHandler e.Control.KeyDown, AddressOf Editor_KeyDown End If End Sub Private Sub Editor_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Dim cell As Cell = GcMultiRow1.CurrentCell If e.KeyCode = Keys.F5 Then Dim editor As InputManCell.GcNumberEditingControl = DirectCast(sender, InputManCell.GcNumberEditingControl) ' クリップボードにコピーします。 editor.SelectionStart = 0 editor.SelectionLength = editor.Text.Length Clipboard.SetDataObject(editor.SelectedText) ' クリップボードのデータを取得して確認します。 Dim cbData As IDataObject = Clipboard.GetDataObject() GcMultiRow1(cell.RowIndex, cell.CellIndex + 1).Value = cbData.GetData(DataFormats.Text).ToString() End If End Sub
using GrapeCity.Win.MultiRow; using InputManCell = GrapeCity.Win.MultiRow.InputMan; private void Form1_Load(object sender, EventArgs e) { InputManCell.GcNumberCell gcNumberCell1 = new InputManCell.GcNumberCell(); // セルに値を設定します。 gcNumberCell1.Fields.SignPrefix.PositivePattern = "\\"; gcNumberCell1.Fields.SignPrefix.NegativePattern = "\\-"; gcNumberCell1.Value = 10000; gcNumberCell1.ClipContent = GrapeCity.Win.Editors.ClipContent.ExcludeLiterals; TextBoxCell textBoxCell1 = new TextBoxCell(); // MultiRowのテンプレートを設定します。 gcMultiRow1.Template = Template.CreateGridTemplate(new Cell[] { gcNumberCell1, textBoxCell1 }); gcMultiRow1.RowCount = 5; } private void gcMultiRow1_EditingControlShowing(object sender, EditingControlShowingEventArgs e) { if (e.Control is InputManCell.GcNumberEditingControl) { // GcNumberCellの編集用コントロールが表示された場合にKeyDownイベントを設定します。 e.Control.KeyDown -= new KeyEventHandler(Editor_KeyDown); e.Control.KeyDown += new KeyEventHandler(Editor_KeyDown); } } private void Editor_KeyDown(object sender, KeyEventArgs e) { Cell cell = gcMultiRow1.CurrentCell; if (e.KeyCode == Keys.F5) { InputManCell.GcNumberEditingControl editor = (InputManCell.GcNumberEditingControl)sender; // クリップボードにコピーします。 editor.SelectionStart = 0; editor.SelectionLength = editor.Text.Length; Clipboard.SetDataObject(editor.SelectedText); // クリップボードのデータを取得して確認します。 IDataObject cbData = Clipboard.GetDataObject(); gcMultiRow1[cell.RowIndex, cell.CellIndex + 1].Value = cbData.GetData(DataFormats.Text).ToString(); } }
GcNumberCellで、ゼロを削除し値を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 | 最初の改行コード以降の文字列を削除します。標準コントロールと同じ動作です。 |
現在カレットが置かれているフィールドは、GcNumberEditingControl.ActiveFieldプロパティで取得できます。
セルに文字列を入力するとGcNumberEditingControl.TextChangingイベントが、GcNumberEditingControl.TextChangedイベントの前(入力された文字列がTextプロパティに渡される前)に発生します。そのため、このイベント内で入力文字列をチェックすれば、Textプロパティの値に影響を与えることなく、入力を制御できます。
ExitOnLastCharプロパティをTrueに設定すると、入力された文字列が、 書式設定により定義された最大桁数に達すると、自動的に次のコントロールへフォーカスを移動できます。