入力可能な列ヘッダを考慮したイベントのコーディング方法

文書番号 : 40548     文書種別 : 使用方法     登録日 : 2017/07/26     最終更新日 : 2017/07/26
文書を印刷する
対象製品
MultiRow for Windows Forms 10.0J
詳細
10.0Jでは列ヘッダセクションと列フッタセクションに配置したセルの編集をユーザーに許可できます。この機能を有効にするにあたって、既存のコードが列ヘッダや列フッタで動作することを考慮する必要があります。

最も発生しやすい問題は、イベントの引数e.RowIndexが列ヘッダセクションや列フッタセクションに適合しないことです。この場合、e.Scopeでセクションの種類を識別し、e.RowIndexの代わりにe.SectionIndexを使用します。e.CellIndexやe.CellNameは共通です。

具体的なコーディングは次のようになります。

[Visual Basic]
Imports GrapeCity.Win.MultiRow

' 次のコードは、編集可能なセルがいずれのセクションに配置されている場合でも
' 編集された値を表示できます。

Private Sub GcMultiRow1_CellEditedFormattedValueChanged(ByVal sender As System.Object, ByVal e As GrapeCity.Win.MultiRow.CellEditedFormattedValueChangedEventArgs) Handles GcMultiRow1.CellEditedFormattedValueChanged
    Dim gcMultiRow As GcMultiRow = TryCast(sender, GcMultiRow)
    Dim currentCell As Cell = Nothing

    Select Case e.Scope
        Case CellScope.ColumnHeader
            ' 列ヘッダセクションの場合
            currentCell = gcMultiRow.ColumnHeaders(e.SectionIndex).Cells(e.CellIndex)
        Case CellScope.Row
            ' 行の場合
            currentCell = gcMultiRow.Rows(e.RowIndex).Cells(e.CellIndex)
        Case CellScope.ColumnFooter
            ' 列フッタセクションの場合
            currentCell = gcMultiRow.ColumnFooters(e.SectionIndex).Cells(e.CellIndex)
    End Select

    If currentCell IsNot Nothing AndAlso currentCell.EditedFormattedValue IsNot Nothing Then
        Console.WriteLine(currentCell.EditedFormattedValue)
    End If
End Sub

[C#]
using GrapeCity.Win.MultiRow;

// 次のコードは、編集可能なセルがいずれのセクションに配置されている場合でも
// 編集された値を表示できます。

private void gcMultiRow1_CellEditedFormattedValueChanged(object sender, CellEditedFormattedValueChangedEventArgs e)
{
    GcMultiRow gcMultiRow = sender as GcMultiRow;
    Cell currentCell = null;

    switch (e.Scope)
    {
        case CellScope.ColumnHeader:
            // 列ヘッダセクションの場合
            currentCell = gcMultiRow.ColumnHeaders[e.SectionIndex].Cells[e.CellIndex];
            
            break;
        case CellScope.Row:
            // 行の場合
            currentCell = gcMultiRow.Rows[e.RowIndex].Cells[e.CellIndex];

           break;
       case CellScope.ColumnFooter:
           // 列フッタセクションの場合
           currentCell = gcMultiRow.ColumnFooters[e.SectionIndex].Cells[e.CellIndex];

            break;
    }

    if (currentCell != null && currentCell.EditedFormattedValue != null)
        Console.WriteLine(currentCell.EditedFormattedValue);
}