作成日: 2019/12/09 最終更新日: 2019/12/20
文書種別
不具合
状況
修正済み
詳細
DefaultSheetDataModelクラスのChangedイベント内でRecalculateメソッドを呼び出すとModelUpdatedタイプのChangedイベントが発生します。ModelUpdatedタイプのChangedイベントはRecalculateAllメソッドが呼ばれた場合にのみ発生します。
【再現手順】
1.新規作成したプロジェクトのForm1にFpSpreadとButtonを貼り付ける。
2.下記サンプルコードを記述する。
3.プロジェクトを実行しButton1を押下する。
■サンプルコード(VB.NET)
【再現手順】
1.新規作成したプロジェクトのForm1にFpSpreadとButtonを貼り付ける。
2.下記サンプルコードを記述する。
3.プロジェクトを実行しButton1を押下する。
■サンプルコード(VB.NET)
Imports FarPoint.Win.Spread.Model
Public Class Form1
Dim WithEvents datamodel As FarPoint.Win.Spread.Model.DefaultSheetDataModel
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' 数式の設定
FpSpread1.ActiveSheet.RowCount = 21
FpSpread1.ActiveSheet.Cells(0, 0).Value = 1
FpSpread1.ActiveSheet.Cells(1, 0).Value = 2
For i = 13 To FpSpread1.ActiveSheet.RowCount - 1
FpSpread1.ActiveSheet.Cells(i, 0).Formula = "A1 + A2"
Next
datamodel = DirectCast(FpSpread1.ActiveSheet.Models.Data, FarPoint.Win.Spread.Model.DefaultSheetDataModel)
' セルごとにChangedイベントの発生
datamodel.UnionedChangeCellRange = False
' セルを評価状態にします
FpSpread1.ActiveSheet.Recalculate()
End Sub
Private Sub datamodel_Changed(sender As Object, e As SheetDataModelEventArgs) Handles datamodel.Changed
' Changedイベントの発生確認
Console.WriteLine([String].Format("{0}:Cell[{1}, {2}]から{3}行{4}列のセルが変更", e.Type, e.Row, e.Column, e.RowCount, e.ColumnCount))
' セルを評価状態にします
FpSpread1.ActiveSheet.Recalculate()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
FpSpread1.ActiveSheet.Cells(0, 0).Value = 10
End Sub
End Class
Public Class Form1
Dim WithEvents datamodel As FarPoint.Win.Spread.Model.DefaultSheetDataModel
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' 数式の設定
FpSpread1.ActiveSheet.RowCount = 21
FpSpread1.ActiveSheet.Cells(0, 0).Value = 1
FpSpread1.ActiveSheet.Cells(1, 0).Value = 2
For i = 13 To FpSpread1.ActiveSheet.RowCount - 1
FpSpread1.ActiveSheet.Cells(i, 0).Formula = "A1 + A2"
Next
datamodel = DirectCast(FpSpread1.ActiveSheet.Models.Data, FarPoint.Win.Spread.Model.DefaultSheetDataModel)
' セルごとにChangedイベントの発生
datamodel.UnionedChangeCellRange = False
' セルを評価状態にします
FpSpread1.ActiveSheet.Recalculate()
End Sub
Private Sub datamodel_Changed(sender As Object, e As SheetDataModelEventArgs) Handles datamodel.Changed
' Changedイベントの発生確認
Console.WriteLine([String].Format("{0}:Cell[{1}, {2}]から{3}行{4}列のセルが変更", e.Type, e.Row, e.Column, e.RowCount, e.ColumnCount))
' セルを評価状態にします
FpSpread1.ActiveSheet.Recalculate()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
FpSpread1.ActiveSheet.Cells(0, 0).Value = 10
End Sub
End Class
回避方法
Service Pack 3(v12.0.4504.2012)で修正済み。
Service Pack を適用せずに対処する場合、Changedイベント内でModelUpdatedタイプかどうかを判定し、ModelUpdatedタイプの場合には処理を行わないようにします。
■サンプルコード(VB.NET)
Service Pack を適用せずに対処する場合、Changedイベント内でModelUpdatedタイプかどうかを判定し、ModelUpdatedタイプの場合には処理を行わないようにします。
■サンプルコード(VB.NET)
Private Sub datamodel_Changed(sender As Object, e As SheetDataModelEventArgs) Handles datamodel.Changed
' ModelUpdatedタイプの場合には処理を行わない
If e.Type = SheetDataModelEventType.ModelUpdated Then Return
' Changedイベントの発生確認
Console.WriteLine([String].Format("Cell[{0}, {1}]から{2}行{3}列のセルが変更", e.Row, e.Column, e.RowCount, e.ColumnCount))
' セルを評価状態にします
FpSpread1.ActiveSheet.Recalculate()
End Sub
' ModelUpdatedタイプの場合には処理を行わない
If e.Type = SheetDataModelEventType.ModelUpdated Then Return
' Changedイベントの発生確認
Console.WriteLine([String].Format("Cell[{0}, {1}]から{2}行{3}列のセルが変更", e.Row, e.Column, e.RowCount, e.ColumnCount))
' セルを評価状態にします
FpSpread1.ActiveSheet.Recalculate()
End Sub
旧文書番号
84710