セルの編集中にコードから該当セルの値を変更すると動作が不定になる

文書番号 : 38956     文書種別 : 使用方法     登録日 : 2015/07/02     最終更新日 : 2015/07/02
文書を印刷する
対象製品
SPREAD for Windows Forms 8.0J
詳細
セルの編集中にコードから該当セルの値を変更すると製品の動作が不定になります。このような状況でセルの値を変更する必要がある場合には、【回避方法】のようにセルの編集を終了させてから値の変更を行います。

【現象再現手順】

1.新規のWindowsFormsプロジェクトを作成する
2.フォームにFpSpread1を貼り付け、下記の再現コードを記述する
3.第一行第一列セルのチェックボックスをクリックする
4.表示されたメッセージボックスの"いいえ"を選択する
--- 再度メッセージボックスが選択され、再び"いいえ"を選択すると以降、繰り返しこの現象が発生する

◎再現コード(VB)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  Me.Text = FpSpread1.ProductVersion
  FpSpread1.ActiveSheet.Columns(0).CellType = New FarPoint.Win.Spread.CellType.CheckBoxCellType()
  
  'セルがアクティブになった場合に編集モードがONとなるように設定します
  FpSpread1.EditModePermanent = True
End Sub

Private Sub FpSpread1_ButtonClicked(sender As Object, e As FarPoint.Win.Spread.EditorNotifyEventArgs) Handles FpSpread1.ButtonClicked
  If e.Column = 0 Then
    If MessageBox.Show("test", Application.ProductName, MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.No Then
      ' セルの値を変更します
      Dim sheet As FarPoint.Win.Spread.SheetView = e.View.GetSheetView()
      sheet.SetValue(e.Row, e.Column, Not CBool(sheet.GetValue(e.Row, e.Column)))
    End If
  End If
End Sub


◎再現コード(C#)
private void Form1_Load(object sender, EventArgs e)
{
  this.Text = fpSpread1.ProductVersion;
  fpSpread1.ActiveSheet.Columns[0].CellType = new FarPoint.Win.Spread.CellType.CheckBoxCellType();
  
  //セルがアクティブになった場合に編集モードがONとなるように設定します
  fpSpread1.EditModePermanent = true;
}

private void fpSpread1_ButtonClicked(object sender, FarPoint.Win.Spread.EditorNotifyEventArgs e)
{
  if (e.Column == 0)
  {
    if (MessageBox.Show("test", Application.ProductName, MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
    {
      // セルの値を変更します
      FarPoint.Win.Spread.SheetView sheet = e.View.GetSheetView();
      sheet.SetValue(e.Row, e.Column, !Convert.ToBoolean(sheet.GetValue(e.Row, e.Column)));
    }
  }
}


【回避方法】

値の変更前にセルの編集モードを終了します

◎回避コード(VB)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  Me.Text = FpSpread1.ProductVersion
  FpSpread1.ActiveSheet.Columns(0).CellType = New FarPoint.Win.Spread.CellType.CheckBoxCellType()
  
  'セルがアクティブになった場合に編集モードがONとなるように設定します
  FpSpread1.EditModePermanent = True
End Sub

Private Sub FpSpread1_ButtonClicked(sender As Object, e As FarPoint.Win.Spread.EditorNotifyEventArgs) Handles FpSpread1.ButtonClicked
  If e.Column = 0 Then
    If MessageBox.Show("test", Application.ProductName, MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.No Then
      ' 【回避コード】編集状態を終了します
      FpSpread1.StopCellEditing()

      ' セルの値を変更します
      Dim sheet As FarPoint.Win.Spread.SheetView = e.View.GetSheetView()
      sheet.SetValue(e.Row, e.Column, Not CBool(sheet.GetValue(e.Row, e.Column)))
    End If
  End If
End Sub


◎回避コード(C#)
private void Form1_Load(object sender, EventArgs e)
{
  this.Text = fpSpread1.ProductVersion;
  fpSpread1.ActiveSheet.Columns[0].CellType = new FarPoint.Win.Spread.CellType.CheckBoxCellType();
  
  //セルがアクティブになった場合に編集モードがONとなるように設定します
  fpSpread1.EditModePermanent = true;
}

private void fpSpread1_ButtonClicked(object sender, FarPoint.Win.Spread.EditorNotifyEventArgs e)
{
  if (e.Column == 0)
  {
    if (MessageBox.Show("test", Application.ProductName, MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
    {
      // セルの値を変更します
      fpSpread1.StopCellEditing();

      // セルの値を変更します
      FarPoint.Win.Spread.SheetView sheet = e.View.GetSheetView();
      sheet.SetValue(e.Row, e.Column, !Convert.ToBoolean(sheet.GetValue(e.Row, e.Column)));
    }
  }
}
関連情報