作成日: 2018/10/30 最終更新日: 2018/10/30
文書種別
制限事項
詳細
データモデルのChangedイベント内で数式を削除すると、Changedイベントが再帰的に発生します。
【再現手順】
1. 新規作成したプロジェクトのフォーム上にSPREADコントロールを貼り付けます。
2. 下記サンプルコードを貼り付けます。
3. プロジェクトを実行し、セルC1の値をクリアします。
-- Changedイベントが再帰的に呼び出され例外(StackOverflowException)が発生します。
■サンプルコード(VB.NET)
【再現手順】
1. 新規作成したプロジェクトのフォーム上にSPREADコントロールを貼り付けます。
2. 下記サンプルコードを貼り付けます。
3. プロジェクトを実行し、セルC1の値をクリアします。
-- Changedイベントが再帰的に呼び出され例外(StackOverflowException)が発生します。
■サンプルコード(VB.NET)
Private WithEvents dm As FarPoint.Win.Spread.Model.DefaultSheetDataModel
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' 数式の設定
FpSpread1.ActiveSheet.Cells(0, 2).Formula = "SUM(A1:B1)"
' 値の設定
FpSpread1.ActiveSheet.SetValue(0, 0, 100)
FpSpread1.ActiveSheet.SetValue(0, 1, 200)
' データモデルの設定
dm = FpSpread1.ActiveSheet.Models.Data
End Sub
Private Sub dm_Changed(sender As Object, e As SheetDataModelEventArgs) Handles dm.Changed
If e.Type = SheetDataModelEventType.CellsUpdated Then
If e.Row = 0 AndAlso e.Column = 2 Then
FpSpread1.ActiveSheet.AutoCalculation = False
If String.IsNullOrEmpty(String.Concat(dm.GetValue(e.Row, e.Column))) Then
dm.SetFormula(e.Row, e.Column, "SUM(A1:B1)")
Else
dm.SetFormula(e.Row, e.Column, Nothing)
End If
FpSpread1.ActiveSheet.AutoCalculation = True
End If
End If
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' 数式の設定
FpSpread1.ActiveSheet.Cells(0, 2).Formula = "SUM(A1:B1)"
' 値の設定
FpSpread1.ActiveSheet.SetValue(0, 0, 100)
FpSpread1.ActiveSheet.SetValue(0, 1, 200)
' データモデルの設定
dm = FpSpread1.ActiveSheet.Models.Data
End Sub
Private Sub dm_Changed(sender As Object, e As SheetDataModelEventArgs) Handles dm.Changed
If e.Type = SheetDataModelEventType.CellsUpdated Then
If e.Row = 0 AndAlso e.Column = 2 Then
FpSpread1.ActiveSheet.AutoCalculation = False
If String.IsNullOrEmpty(String.Concat(dm.GetValue(e.Row, e.Column))) Then
dm.SetFormula(e.Row, e.Column, "SUM(A1:B1)")
Else
dm.SetFormula(e.Row, e.Column, Nothing)
End If
FpSpread1.ActiveSheet.AutoCalculation = True
End If
End If
End Sub
回避方法
Changedイベントで数式を削除する前後に一時的にイベントを解除することで現象が回避可能です。
■サンプルコード(VB.NET)
■サンプルコード(VB.NET)
Private Sub dm_Changed(sender As Object, e As SheetDataModelEventArgs) Handles dm.Changed
If e.Type = SheetDataModelEventType.CellsUpdated Then
If e.Row = 0 AndAlso e.Column = 2 Then
FpSpread1.ActiveSheet.AutoCalculation = False
RemoveHandler dm.Changed, AddressOf dm_Changed ' <== 対応策[1/2]
If String.IsNullOrEmpty(String.Concat(dm.GetValue(e.Row, e.Column))) Then
dm.SetFormula(e.Row, e.Column, "SUM(A1:B1)")
Else
dm.SetFormula(e.Row, e.Column, Nothing)
End If
AddHandler dm.Changed, AddressOf dm_Changed ' <== 対応策[2/2]
FpSpread1.ActiveSheet.AutoCalculation = True
End If
End If
End Sub
If e.Type = SheetDataModelEventType.CellsUpdated Then
If e.Row = 0 AndAlso e.Column = 2 Then
FpSpread1.ActiveSheet.AutoCalculation = False
RemoveHandler dm.Changed, AddressOf dm_Changed ' <== 対応策[1/2]
If String.IsNullOrEmpty(String.Concat(dm.GetValue(e.Row, e.Column))) Then
dm.SetFormula(e.Row, e.Column, "SUM(A1:B1)")
Else
dm.SetFormula(e.Row, e.Column, Nothing)
End If
AddHandler dm.Changed, AddressOf dm_Changed ' <== 対応策[2/2]
FpSpread1.ActiveSheet.AutoCalculation = True
End If
End If
End Sub
旧文書番号
83343