作成日: 2024/05/22 最終更新日: 2024/09/18
文書種別
不具合
状況
修正済み
詳細
データセットを利用した階層表示を行う際に、基となるデータセットをクリアすると、後続の処理でNullReferenceExceptionの例外が発生する場合があります。
例えば、以下のような処理で、実行時に子階層を開いて2列目のセルを選択し、Button1をクリックすると、子階層のデータ作成の処理で例外が発生します。
[Visual Basic]
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' データソースの初期化
ds = New DataSet()
dt1 = ds.Tables.Add("Parent")
dt1.Columns.Add("ParentA", GetType(Int32))
dt2 = ds.Tables.Add("Child")
dt2.Columns.Add("ChildA", GetType(Int32))
dt2.Columns.Add("ChildB", GetType(String))
' データ処理の実行
Button1.PerformClick()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' データセットのクリア処理
ds.Clear()
dt1.Clear()
dt2.Clear()
ds.Relations.Clear()
dt1.Constraints.Clear()
dt2.Constraints.Clear()
ds.Tables.Clear()
' データの設定
Dim rowMax1 = 9
For i As Integer = 0 To rowMax1
dt1.Rows.Add(i)
Next
Dim rowMax2 = 4
For i As Integer = 0 To rowMax1
For j As Integer = 0 To rowMax2
dt2.Rows.Add(i, $"P{i}C{j}") ' <== ここで例外が発生します。
Next
Next
If ds.Tables.Count = 0 Then
ds.Tables.Add(dt1)
ds.Tables.Add(dt2)
End If
ds.Relations.Add("Relation2", dt1.Columns("ParentA"), dt2.Columns("ChildA"))
' データの連結
FpSpread1.Sheets(0).DataSource = ds
End Sub
この現象は、データセットのクリアにより子階層のViewが削除される際に、子階層のViewの一部のイベントが削除されないために発生します。
回避方法
Service Pack 1(v17.0.4802.2022/v17.1.0)で修正済み。
Service Pack 1を適用せずに対処する方法としては、子階層が削除される際に、以下の回避コードのようにして関連するイベントを明示的に削除します。
[Visual Basic]
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' データソースの初期化
ds = New DataSet()
dt1 = ds.Tables.Add("Parent")
dt1.Columns.Add("ParentA", GetType(Int32))
dt2 = ds.Tables.Add("Child")
dt2.Columns.Add("ChildA", GetType(Int32))
dt2.Columns.Add("ChildB", GetType(String))
' データ処理の実行
Button1.PerformClick()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' 回避コード
Dim childs As ArrayList = FpSpread1.GetRootWorkbook().GetChildWorkbooks()
If (childs.Count > 0) Then
For i As Integer = 0 To childs.Count - 1
CType(childs(i), FarPoint.Win.Spread.SpreadView).Sheets.Clear()
Next
End If
' データセットのクリア処理
ds.Clear()
dt1.Clear()
dt2.Clear()
ds.Relations.Clear()
dt1.Constraints.Clear()
dt2.Constraints.Clear()
ds.Tables.Clear()
' データの設定
Dim rowMax1 = 9
For i As Integer = 0 To rowMax1
dt1.Rows.Add(i)
Next
Dim rowMax2 = 4
For i As Integer = 0 To rowMax1
For j As Integer = 0 To rowMax2
dt2.Rows.Add(i, $"P{i}C{j}") ' <== ここで例外が発生します。
Next
Next
If ds.Tables.Count = 0 Then
ds.Tables.Add(dt1)
ds.Tables.Add(dt2)
End If
ds.Relations.Add("Relation2", dt1.Columns("ParentA"), dt2.Columns("ChildA"))
' データの連結
FpSpread1.Sheets(0).DataSource = ds
End Sub