作成日: 2021/09/24 最終更新日: 2022/04/06
文書種別
不具合
状況
修正済み
詳細
シートのRemoveRowsメソッドを使用して行を削除する、またはRowCountプロパティを使用してシートの行数を減らす際に、シートのRowChangedイベントが発生しない場合があります。本現象は以下の条件を満たす場合に発生します。
・RemoveRowsメソッド:削除する最初の行のインデックスが変更後の行数と等しい
・RowCountプロパティ:変更後の行数が変更前より小さい
※RowsクラスのRemoveメソッドでもRemoveRowsメソッドと同様の問題が発生します。
【再現手順】
1. フォーム上にSPREADコントロール1つとボタンを3つ配置し、下記のコードを記述します。
2. アプリケーションを実行します。
3. ボタン1をクリックします。
---RowChangedイベントが発生しません。
4. ボタン3をクリックしてデフォルトの状態に戻します。
5. ボタン2をクリックします。
---RowChangedイベントが発生しません。
サンプルコード(VB)
Imports FarPoint.Win.Spread
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
FpSpread1.ActiveSheet.RemoveRows(0, FpSpread1.ActiveSheet.RowCount)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
FpSpread1.ActiveSheet.RowCount = 10
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
FpSpread1.Reset()
End Sub
Private Sub FpSpread1_Sheet1_RowChanged(sender As Object, e As SheetViewEventArgs) Handles FpSpread1_Sheet1.RowChanged
MessageBox.Show("FpSpread1_Sheet1_RowChanged")
End Sub
End Class
回避方法
Service Pack 9(v12.0.4512.2012)で修正済み。
Service Pack 9を適用せずに対処する方法としては、以下の条件を満たす場合にRowChangedイベントを明示的に呼び出すことで回避可能です。
・RemoveRowsメソッド:削除する最初の行のインデックスが変更後の行数と等しい
・RowCountプロパティ:変更後の行数が変更前より小さい
サンプルコード(VB)
Imports FarPoint.Win.Spread
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim removeRowIndex As Integer = 0
FpSpread1.ActiveSheet.RemoveRows(removeRowIndex, FpSpread1.ActiveSheet.RowCount)
workaround_RemoveRows(removeRowIndex)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim beforeRowCount As Integer = FpSpread1.ActiveSheet.RowCount
FpSpread1.ActiveSheet.RowCount = 10
workaround_RowCount(beforeRowCount)
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
FpSpread1.Reset()
End Sub
Private Sub FpSpread1_Sheet1_RowChanged(sender As Object, e As SheetViewEventArgs) Handles FpSpread1_Sheet1.RowChanged
MessageBox.Show("FpSpread1_Sheet1_RowChanged")
End Sub
Private Sub workaround_RowCount(ByVal beforeRowCount As Integer)
If beforeRowCount > FpSpread1.ActiveSheet.RowCount Then
FpSpread1_Sheet1_RowChanged(Me, New SheetViewEventArgs(-1, -1))
End If
End Sub
Private Sub workaround_RemoveRows(ByVal removeRowIndex As Integer)
If removeRowIndex = FpSpread1.ActiveSheet.RowCount Then
FpSpread1_Sheet1_RowChanged(Me, New SheetViewEventArgs(-1, -1))
End If
End Sub
End Class