セルの背景色を変更するとNullReferenceExceptionが発生します

文書番号 : 38955     文書種別 : 使用方法     登録日 : 2015/07/02     最終更新日 : 2015/07/02
文書を印刷する
対象製品
SPREAD for Windows Forms 8.0J
詳細
セルの編集時にセルの背景色を変更するとNullReferenceExceptionが発生する場合があります。NullReferenceExceptionは、コード内に存在しないオブジェクトを参照しようとした場合に発生する一般的な例外です。

セルを編集状態へ移行すると、SPREADでは通常はGeneralEditorクラスを入力エディタとして使用します。また、コンボボックス型セルの場合にはFpComboクラスを使用します。ユーザーがセルを編集を開始した状態で、セルの背景色の変更を行う場合には、シートに対してではなく、この入力エディタの背景色を変更する必要があります。

下記サンプルはEditChangeイベント、EditModeOnイベント、ComboSelChangeイベントで入力エディタの背景色を変更する例です。これら全てのイベントを追加する必要はありませんので、アプリケーション側で必要な処理に応じて実装してください。

◎サンプルコード(VB)
' EditChangeイベント
Private Sub FpSpread1_EditChange(ByVal sender As System.Object, ByVal e As FarPoint.Win.Spread.EditorNotifyEventArgs) Handles FpSpread1.EditChange
  ' 編集可能セルの場合
  If TypeOf (e.View.GetSheetView.GetCellType(e.Row, e.Column)) Is FarPoint.Win.Spread.CellType.EditBaseCellType Then
    ' 入力エディタの背景色を変更します
    CType(FpSpread1.EditingControl, FarPoint.Win.Spread.CellType.GeneralEditor).BackColor = Color.Red
  End If

  ' コンボボックス型セルの場合
  If TypeOf (e.View.GetSheetView.GetCellType(e.Row, e.Column)) Is FarPoint.Win.Spread.CellType.ComboBoxCellType Then
    ' 入力エディタの背景色を変更します
    CType(FpSpread1.EditingControl, FarPoint.Win.FpCombo).BackColor = Color.Red
  End If
End Sub


' EditModeOnイベント
Private Sub FpSpread1_EditModeOn(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FpSpread1.EditModeOn
  Dim row As Integer = FpSpread1.ActiveSheet.ActiveRowIndex
  Dim col As Integer = FpSpread1.ActiveSheet.ActiveColumnIndex
  ' 編集可能セルの場合
  If TypeOf (FpSpread1.ActiveSheet.GetCellType(row, col)) Is FarPoint.Win.Spread.CellType.EditBaseCellType Then
    ' 入力エディタの背景色を変更します
    CType(FpSpread1.EditingControl, FarPoint.Win.Spread.CellType.GeneralEditor).BackColor = Color.Red
  End If

  ' コンボボックス型セルの場合
  If TypeOf (FpSpread1.ActiveSheet.GetCellType(row, col)) Is FarPoint.Win.Spread.CellType.ComboBoxCellType Then
    ' 入力エディタの背景色を変更します
    CType(FpSpread1.EditingControl, FarPoint.Win.FpCombo).BackColor = Color.Red
  End If
End Sub


' ComboSelChangeイベント
Private Sub FpSpread1_ComboSelChange(ByVal sender As System.Object, ByVal e As FarPoint.Win.Spread.EditorNotifyEventArgs) Handles FpSpread1.ComboSelChange
  If TypeOf (e.View.GetSheetView.GetCellType(e.Row, e.Column)) Is FarPoint.Win.Spread.CellType.ComboBoxCellType Then
    ' 入力エディタの背景色を変更します
    CType(FpSpread1.EditingControl, FarPoint.Win.FpCombo).BackColor = Color.Red
  End If
End Sub


◎サンプルコード(C#)
// EditChangeイベント
private void fpSpread1_EditChange(object sender, FarPoint.Win.Spread.EditorNotifyEventArgs e)
{
  // 編集可能セルの場合
  if (fpSpread1.ActiveSheet.GetCellType(e.Row, e.Column) is FarPoint.Win.Spread.CellType.EditBaseCellType)
  {
    // 入力エディタの背景色を変更します
    ((FarPoint.Win.Spread.CellType.GeneralEditor)e.EditingControl).BackColor = Color.Red;
  }

  // コンボボックス型セルの場合
  if (fpSpread1.ActiveSheet.GetCellType(e.Row, e.Column) is FarPoint.Win.Spread.CellType.ComboBoxCellType)
  {
    // 入力エディタの背景色を変更します
    ((FarPoint.Win.FpCombo)e.EditingControl).BackColor = Color.Red;
  }
}


// EditModeOnイベント
private void fpSpread1_EditModeOn(object sender, EventArgs e)
{
  int row = fpSpread1.ActiveSheet.ActiveRowIndex;
  int col = fpSpread1.ActiveSheet.ActiveColumnIndex;
  // 編集可能セルの場合
  if (fpSpread1.ActiveSheet.GetCellType(row, col) is FarPoint.Win.Spread.CellType.EditBaseCellType)
  {
    // 入力エディタの背景色を変更します
    ((FarPoint.Win.Spread.CellType.GeneralEditor)fpSpread1.EditingControl).BackColor = Color.Red;
  }

  // コンボボックス型セルの場合
  if (fpSpread1.ActiveSheet.GetCellType(row, col) is FarPoint.Win.Spread.CellType.ComboBoxCellType)
  {
    // 入力エディタの背景色を変更します
    ((FarPoint.Win.FpCombo)fpSpread1.EditingControl).BackColor = Color.Red;
  }
}


// ComboSelChangeイベント
private void fpSpread1_ComboSelChange(object sender, FarPoint.Win.Spread.EditorNotifyEventArgs e)
{
  // コンボボックス型セルの場合
  if (fpSpread1.ActiveSheet.GetCellType(e.Row, e.Column) is FarPoint.Win.Spread.CellType.ComboBoxCellType)
  {
    // 入力エディタの背景色を変更します
    ((FarPoint.Win.FpCombo)e.EditingControl).BackColor = Color.Red;
  }
}


セルの編集が終了すると入力エディタは破棄されるため、入力エディタに設定した背景色はシートには反映されません。この背景色をシート上のセルに反映させるためには、セルが編集モードが終了するときに発生するEditModeOffイベント内で入力エディタの背景色を該当セルの背景色に設定します。

◎サンプルコード(VB)
' EditModeOffイベント
Private Sub FpSpread1_EditModeOff(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FpSpread1.EditModeOff
  Dim row As Integer = FpSpread1.ActiveSheet.ActiveRowIndex
  Dim col As Integer = FpSpread1.ActiveSheet.ActiveColumnIndex
  ' 編集可能セルの場合
  If TypeOf (FpSpread1.ActiveSheet.GetCellType(row, col)) Is FarPoint.Win.Spread.CellType.EditBaseCellType Then
    ' シートの背景色を設定します
    FpSpread1.ActiveSheet.ActiveCell.BackColor = CType(FpSpread1.EditingControl, FarPoint.Win.Spread.CellType.GeneralEditor).BackColor
  End If

  ' コンボボックス型セルの場合
  If TypeOf (FpSpread1.ActiveSheet.GetCellType(row, col)) Is FarPoint.Win.Spread.CellType.ComboBoxCellType Then
    ' シートの背景色を設定します
    FpSpread1.ActiveSheet.ActiveCell.BackColor = CType(FpSpread1.EditingControl, FarPoint.Win.FpCombo).BackColor
  End If
End Sub


◎サンプルコード(C#)
// EditModeOffイベント
private void fpSpread1_EditModeOff(object sender, EventArgs e)
{
  int row = fpSpread1.ActiveSheet.ActiveRowIndex;
  int col = fpSpread1.ActiveSheet.ActiveColumnIndex;
  // 編集可能セルの場合
  if (fpSpread1.ActiveSheet.GetCellType(row, col) is FarPoint.Win.Spread.CellType.EditBaseCellType)
  {
    // シートの背景色を設定します
    fpSpread1.ActiveSheet.ActiveCell.BackColor = ((FarPoint.Win.Spread.CellType.GeneralEditor)fpSpread1.EditingControl).BackColor;
  }

  // コンボボックス型セルの場合
  if (fpSpread1.ActiveSheet.GetCellType(row, col) is FarPoint.Win.Spread.CellType.ComboBoxCellType)
  {
    // シートの背景色を設定します
    fpSpread1.ActiveSheet.ActiveCell.BackColor = ((FarPoint.Win.FpCombo)fpSpread1.EditingControl).BackColor;
  }
}
関連情報