作成日: 2018/10/23 最終更新日: 2018/12/18
文書種別
不具合
状況
修正済み
詳細
■事象
SetArrayメソッドを使用して、行・列の範囲外(存在しないセル)に値(配列)を設定した時、DataModelのChangedイベントが不要に発生します。
■サンプルコード(VB.NET)
■問題発生状況
上記サンプルコードを実装した場合、コンソールには以下のように出力されます。
row=0 col=0 value=0
row=1 col=0 value=1
row=2 col=0 value=2
row=0 col=0 value=0
row=0 col=1 value=10
row=1 col=1 value=11
row=2 col=1 value=12
row=0 col=1 value=10
row=0 col=2 value=
row=0 col=3 value=
最後の2行は、DataModelのChangedイベントが不要に発生したために出力された内容です。
SetArrayメソッドを使用して、行・列の範囲外(存在しないセル)に値(配列)を設定した時、DataModelのChangedイベントが不要に発生します。
■サンプルコード(VB.NET)
Private WithEvents mobjDataModel As DefaultSheetDataModel 'DataModel object.
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' 行・列数を設定します。
FpSpread1.ActiveSheet.RowCount = 3
FpSpread1.ActiveSheet.ColumnCount = 2
' DataModelを取得します。
mobjDataModel = DirectCast(FpSpread1.ActiveSheet.Models.Data, DefaultSheetDataModel)
' SetArrayメソッドで値(配列)を設定します。
Dim i As Integer = 0 ' 行インデックス
Dim j As Integer ' 列インデックス
For j = 0 To 3
Dim sData(,) As String
sData = {{j * 10}, {j * 10 + 1}, {j * 10 + 2}}
FpSpread1.ActiveSheet.SetArray(i, j, sData)
Next
End Sub
Private Sub mobjDataModel_Changed _
(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.Model.SheetDataModelEventArgs) _
Handles mobjDataModel.Changed
' コンソール出力
Console.WriteLine("row={0} col={1} value={2}", e.Row, e.Column, mobjDataModel.GetValue(e.Row, e.Column))
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' 行・列数を設定します。
FpSpread1.ActiveSheet.RowCount = 3
FpSpread1.ActiveSheet.ColumnCount = 2
' DataModelを取得します。
mobjDataModel = DirectCast(FpSpread1.ActiveSheet.Models.Data, DefaultSheetDataModel)
' SetArrayメソッドで値(配列)を設定します。
Dim i As Integer = 0 ' 行インデックス
Dim j As Integer ' 列インデックス
For j = 0 To 3
Dim sData(,) As String
sData = {{j * 10}, {j * 10 + 1}, {j * 10 + 2}}
FpSpread1.ActiveSheet.SetArray(i, j, sData)
Next
End Sub
Private Sub mobjDataModel_Changed _
(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.Model.SheetDataModelEventArgs) _
Handles mobjDataModel.Changed
' コンソール出力
Console.WriteLine("row={0} col={1} value={2}", e.Row, e.Column, mobjDataModel.GetValue(e.Row, e.Column))
End Sub
■問題発生状況
上記サンプルコードを実装した場合、コンソールには以下のように出力されます。
row=0 col=0 value=0
row=1 col=0 value=1
row=2 col=0 value=2
row=0 col=0 value=0
row=0 col=1 value=10
row=1 col=1 value=11
row=2 col=1 value=12
row=0 col=1 value=10
row=0 col=2 value=
row=0 col=3 value=
最後の2行は、DataModelのChangedイベントが不要に発生したために出力された内容です。
回避方法
Service Pack 2(v11.0.4503.2012)で修正済み。
Service Pack 2を適用せずに対処する方法としては、SetArrayメソッドで値を追加しようとしているセルがSPREAD上に存在することをあらかじめ確認してから、SetArrayメソッドを実行する方法が有効です。
上記のサンプルコードの場合、以下のようになります。(SetArrayメソッドを実行している箇所のみ抜粋)
■サンプルコード(VB.NET)
Service Pack 2を適用せずに対処する方法としては、SetArrayメソッドで値を追加しようとしているセルがSPREAD上に存在することをあらかじめ確認してから、SetArrayメソッドを実行する方法が有効です。
上記のサンプルコードの場合、以下のようになります。(SetArrayメソッドを実行している箇所のみ抜粋)
■サンプルコード(VB.NET)
Dim i As Integer = 0
Dim j As Integer
For j = 0 To 1
' ***** 回避策(ここから)*****
If i > (FpSpread1.ActiveSheet.RowCount - 1) Then Exit For
If j > (FpSpread1.ActiveSheet.ColumnCount - 1) Then Exit For
' ***** 回避策(ここまで)*****
Dim sData(,) As String
sData = {{j * 10}, {j * 10 + 1}, {j * 10 + 2}}
FpSpread1.ActiveSheet.SetArray(i, j, sData)
Next
Dim j As Integer
For j = 0 To 1
' ***** 回避策(ここから)*****
If i > (FpSpread1.ActiveSheet.RowCount - 1) Then Exit For
If j > (FpSpread1.ActiveSheet.ColumnCount - 1) Then Exit For
' ***** 回避策(ここまで)*****
Dim sData(,) As String
sData = {{j * 10}, {j * 10 + 1}, {j * 10 + 2}}
FpSpread1.ActiveSheet.SetArray(i, j, sData)
Next
旧文書番号
83319