文字列型セル(TextBoxCell)に入力された値を数値として格納するには?

文書番号 : 40568     文書種別 : 使用方法     登録日 : 2017/07/26     最終更新日 : 2017/07/26
文書を印刷する
対象製品
MultiRow for Windows Forms 10.0J
詳細
文字列型セル(TextBoxCell)に次のような設定を行ったとき、デザイナで入力した値やユーザーが入力した値に設定が適用されない場合があります。
  • スタイルの書式に数値用の書式を指定した場合(例: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;
}