文字列型セル(TextBoxCell)に入力された値を数値として格納するには?
対象製品
MultiRow for Windows Forms 10.0J
詳細
文字列型セル(TextBoxCell)に次のような設定を行ったとき、デザイナで入力した値やユーザーが入力した値に設定が適用されない場合があります。
[Visual Basic]
[C#]
これは、TextBoxCellの値が文字列型で格納されていることが原因と考えられます。TextBoxCellはTextBoxCell.FormattedValueTypeが示すように入力と表示にString型を使用します。
TextBoxCellに入力された値を数値として保持するには、GcMultiRow.CellParsingイベントを実装するか、または数値型(Decimal型など)のデータフィールドに連結します。
GcMultiRow.CellParsingイベントを実装する場合:
[Visual Basic]
[C#]
データバインドする場合:
[Visual Basic]
[C#]
- スタイルの書式に数値用の書式を指定した場合(例:TextBoxCell.Style.Format = "N0")
- 件付きセルスタイルで数値の範囲を指定した場合(例:ConditionalCellStyle)
[Visual Basic]
' 注意:以下のコードを実行し、「999,999」や「-1000」を入力したとき、書式やスタイルは適用されません Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim textBoxCell1 As New TextBoxCell() ' 通常のセルスタイルと条件付きセルスタイルを同時に使用するための結合セルスタイル Dim combinedCellStyle1 As New CombinedCellStyle() ' 共通の文字書式を定義する Dim baseStyle As New CellStyle() baseStyle.Format = "N0" combinedCellStyle1.Items.Add(baseStyle) ' 条件付き書式を定義する Dim conditionalCellStyle1 As New ConditionalCellStyle() ' 値がnullの場合は文字色は黒 Dim normalValue As New CellStyle() normalValue.ForeColor = Color.Black Dim item1 As New ConditionalCellStyleItem(normalValue, ConditionalCellStyleOperator.IsNull) ' 値が0以下の場合は文字色は赤 Dim minusValueStyle As New CellStyle() minusValueStyle.ForeColor = Color.Red Dim item2 As New ConditionalCellStyleItem(minusValueStyle, ConditionalCellStyleOperator.LessThan) item2.Value1 = 0 conditionalCellStyle1.Items.Add(item1) conditionalCellStyle1.Items.Add(item2) combinedCellStyle1.Items.Add(conditionalCellStyle1) textBoxCell1.Style = combinedCellStyle1 GcMultiRow1.Template = Template.CreateGridTemplate(New Cell() {textBoxCell1}) GcMultiRow1.RowCount = 5 End Sub
[C#]
// 注意:以下のコードを実行し、「999,999」や「-1000」を入力したとき、書式やスタイルは適用されません using GrapeCity.Win.MultiRow; private void Form1_Load(object sender, EventArgs e) { TextBoxCell textBoxCell1 = new TextBoxCell(); // 通常のセルスタイルと条件付きセルスタイルを同時に使用するための結合セルスタイル CombinedCellStyle combinedCellStyle1 = new CombinedCellStyle(); // 共通の文字書式を定義する CellStyle baseStyle = new CellStyle(); baseStyle.Format = "N0"; combinedCellStyle1.Items.Add(baseStyle); // 条件付き書式を定義する ConditionalCellStyle conditionalCellStyle1 = new ConditionalCellStyle(); // 値がnullの場合は文字色は黒 CellStyle normalValue = new CellStyle(); normalValue.ForeColor = Color.Black; ConditionalCellStyleItem item1 = new ConditionalCellStyleItem(normalValue, ConditionalCellStyleOperator.IsNull); // 値が0以下の場合は文字色は赤 CellStyle minusValueStyle = new CellStyle(); minusValueStyle.ForeColor = Color.Red; ConditionalCellStyleItem item2 = new ConditionalCellStyleItem(minusValueStyle, ConditionalCellStyleOperator.LessThan); item2.Value1 = 0; conditionalCellStyle1.Items.Add(item1); conditionalCellStyle1.Items.Add(item2); combinedCellStyle1.Items.Add(conditionalCellStyle1); textBoxCell1.Style = combinedCellStyle1; gcMultiRow1.Template = Template.CreateGridTemplate(new Cell[] { textBoxCell1 }); gcMultiRow1.RowCount = 5; }
これは、TextBoxCellの値が文字列型で格納されていることが原因と考えられます。TextBoxCellはTextBoxCell.FormattedValueTypeが示すように入力と表示にString型を使用します。
TextBoxCellに入力された値を数値として保持するには、GcMultiRow.CellParsingイベントを実装するか、または数値型(Decimal型など)のデータフィールドに連結します。
GcMultiRow.CellParsingイベントを実装する場合:
[Visual Basic]
Private Sub GcMultiRow1_CellParsing(ByVal sender As System.Object, ByVal e As GrapeCity.Win.MultiRow.CellParsingEventArgs) Handles GcMultiRow1.CellParsing Dim gcMultiRow As GcMultiRow = TryCast(sender, GcMultiRow) If e.Scope = CellScope.Row Then Dim currentCell As Cell = gcMultiRow.Rows(e.RowIndex).Cells(e.CellIndex) If TypeOf currentCell Is TextBoxCell AndAlso e.Value IsNot Nothing Then Dim dValue As Decimal = 0 If Decimal.TryParse(e.Value.ToString(), dValue) = True Then e.Value = dValue End If e.ParsingApplied = True End If End If End Sub
[C#]
private void gcMultiRow1_CellParsing(object sender, GrapeCity.Win.MultiRow.CellParsingEventArgs e) { GcMultiRow gcMultiRow = sender as GcMultiRow; if (e.Scope == CellScope.Row) { Cell currentCell = gcMultiRow.Rows[e.RowIndex].Cells[e.CellIndex]; if (currentCell is TextBoxCell && e.Value != null) { decimal dValue = 0; if (decimal.TryParse(e.Value.ToString(), out dValue) == true) { e.Value = dValue; } e.ParsingApplied = true; } } }
データバインドする場合:
[Visual Basic]
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim textBoxCell1 As New TextBoxCell() ' 通常のセルスタイルと条件付きセルスタイルを同時に使用するための結合セルスタイル Dim combinedCellStyle1 As New CombinedCellStyle() ' 共通の文字書式を定義する Dim baseStyle As New CellStyle() baseStyle.Format = "N0" combinedCellStyle1.Items.Add(baseStyle) ' 条件付き書式を定義する Dim conditionalCellStyle1 As New ConditionalCellStyle() ' 値がnullの場合は文字色は黒 Dim normalValue As New CellStyle() normalValue.ForeColor = Color.Black Dim item1 As New ConditionalCellStyleItem(normalValue, ConditionalCellStyleOperator.IsNull) ' 値が0以下の場合は文字色は赤 Dim minusValueStyle As New CellStyle() minusValueStyle.ForeColor = Color.Red Dim item2 As New ConditionalCellStyleItem(minusValueStyle, ConditionalCellStyleOperator.LessThan) item2.Value1 = 0 conditionalCellStyle1.Items.Add(item1) conditionalCellStyle1.Items.Add(item2) combinedCellStyle1.Items.Add(conditionalCellStyle1) textBoxCell1.Style = combinedCellStyle1 textBoxCell1.DataField = "Column1" GcMultiRow1.Template = Template.CreateGridTemplate(New Cell() {textBoxCell1}) GcMultiRow1.RowCount = 5 Dim table1 As New DataTable() table1.Columns.Add("Column1", GetType(Decimal)) GcMultiRow1.DataSource = table1 End Sub
[C#]
private void Form1_Load(object sender, EventArgs e) { TextBoxCell textBoxCell1 = new TextBoxCell(); // 通常のセルスタイルと条件付きセルスタイルを同時に使用するための結合セルスタイル CombinedCellStyle combinedCellStyle1 = new CombinedCellStyle(); // 共通の文字書式を定義する CellStyle baseStyle = new CellStyle(); baseStyle.Format = "N0"; combinedCellStyle1.Items.Add(baseStyle); // 条件付き書式を定義する ConditionalCellStyle conditionalCellStyle1 = new ConditionalCellStyle(); // 値がnullの場合は文字色は黒 CellStyle normalValue = new CellStyle(); normalValue.ForeColor = Color.Black; ConditionalCellStyleItem item1 = new ConditionalCellStyleItem(normalValue, ConditionalCellStyleOperator.IsNull); // 値が0以下の場合は文字色は赤 CellStyle minusValueStyle = new CellStyle(); minusValueStyle.ForeColor = Color.Red; ConditionalCellStyleItem item2 = new ConditionalCellStyleItem(minusValueStyle, ConditionalCellStyleOperator.LessThan); item2.Value1 = 0; conditionalCellStyle1.Items.Add(item1); conditionalCellStyle1.Items.Add(item2); combinedCellStyle1.Items.Add(conditionalCellStyle1); textBoxCell1.Style = combinedCellStyle1; textBoxCell1.DataField = "Column1"; gcMultiRow1.Template = Template.CreateGridTemplate(new Cell[] { textBoxCell1 }); DataTable table1 = new DataTable(); table1.Columns.Add("Column1", typeof(decimal)); gcMultiRow1.DataSource = table1; }