作成日: 2018/05/23 最終更新日: 2018/06/22
文書種別
不具合
状況
修正済み
詳細
■事象
以下の条件をすべて満たすとき、正常に動作しない機能・操作があります。
・条件式内でデータ連結している列を参照している
・条件付き書式をデータ連結している列に設定している
■発生する問題
発生する問題は、以下の通りです。
□問題1:データ連結した列の値を編集すると例外が発生する
データ連結した列の任意のセルを編集すると、以下の例外が発生します。
------------------------------------------------------
System.Exception: FpSpread.WndProcメソッドで例外が発生しました
□問題2:条件付き書式が正しく動作しない
条件式が参照している列(セル)の値を変更しても、条件付き書式が評価されず、書式が変更されません。
■再現用サンプルコード(VB.NET)
■再現手順(上記サンプルコードの場合)
□問題1:データ連結した列の値を編集すると例外が発生する
1) 任意のセルの値を変更します。
2) 別のセルをクリックします。
→例外が発生します。
□問題2:条件付き書式が正しく動作しない
1) 任意の行の2列目のセルにチェックを入れ、別のセルに移動します。
→同じ行の3列目と4列目の背景色が変わります(正常な動作)
2) 任意の行の2列目のセルにチェックを入れ、別のセルに移動します。
→同じ行の3列目と4列目の背景色が変わりません(条件付き書式が動作していない状態)
以下の条件をすべて満たすとき、正常に動作しない機能・操作があります。
- SPREADコントロールに対してデータ連結している(DataSourcrプロパティを設定している)
- データ連結している列に関係する条件付き書式を設定している(※)
- データ連結している列でフィルタリングした状態である
・条件式内でデータ連結している列を参照している
・条件付き書式をデータ連結している列に設定している
■発生する問題
発生する問題は、以下の通りです。
□問題1:データ連結した列の値を編集すると例外が発生する
データ連結した列の任意のセルを編集すると、以下の例外が発生します。
------------------------------------------------------
System.Exception: FpSpread.WndProcメソッドで例外が発生しました
□問題2:条件付き書式が正しく動作しない
条件式が参照している列(セル)の値を変更しても、条件付き書式が評価されず、書式が変更されません。
■再現用サンプルコード(VB.NET)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' データを生成し、SPREADに連結します。
Dim dt As New DataTable("Test")
dt.Columns.Add("Col1", GetType(String))
dt.Columns.Add("Col2", GetType(Boolean))
dt.Columns.Add("Col3", GetType(Boolean))
dt.Columns.Add("Col4", GetType(DateTime))
For i As Integer = 0 To 9
dt.Rows.Add("test", False, ((i Mod 2) = 0), System.DateTime.Now.AddDays((i Mod 3)))
Next
dt.AcceptChanges()
FpSpread1.ActiveSheet.DataAutoHeadings = False
FpSpread1.ActiveSheet.DataSource = dt
' 条件付き書式を設定します。
' ※以下のコードでは「B列の値が"True"の時、背景色を"Aqua"に設定する」という条件付き書式をC列とD列に設定しています。
Me.FpSpread1.ActiveSheet.SetConditionalFormatting _
(New FarPoint.Win.Spread.Model.CellRange() _
{ _
New FarPoint.Win.Spread.Model.CellRange(-1, 2, -1, 1), _
New FarPoint.Win.Spread.Model.CellRange(-1, 3, -1, 1) _
}, _
New FarPoint.Win.Spread.IConditionalFormattingRule() { _
New FarPoint.Win.Spread.FormulaConditionalFormattingRule("$B1=True", True) With {.BackColor = Color.Aqua}})
' 行をフィルタリングします。
' ※以下のコードでは、C列の値が"False"の行のみ表示しています。
FpSpread1.ActiveSheet.SetColumnAllowFilter(2, True)
FpSpread1.ActiveSheet.AutoFilterColumn(2, False, 0)
End Sub
' データを生成し、SPREADに連結します。
Dim dt As New DataTable("Test")
dt.Columns.Add("Col1", GetType(String))
dt.Columns.Add("Col2", GetType(Boolean))
dt.Columns.Add("Col3", GetType(Boolean))
dt.Columns.Add("Col4", GetType(DateTime))
For i As Integer = 0 To 9
dt.Rows.Add("test", False, ((i Mod 2) = 0), System.DateTime.Now.AddDays((i Mod 3)))
Next
dt.AcceptChanges()
FpSpread1.ActiveSheet.DataAutoHeadings = False
FpSpread1.ActiveSheet.DataSource = dt
' 条件付き書式を設定します。
' ※以下のコードでは「B列の値が"True"の時、背景色を"Aqua"に設定する」という条件付き書式をC列とD列に設定しています。
Me.FpSpread1.ActiveSheet.SetConditionalFormatting _
(New FarPoint.Win.Spread.Model.CellRange() _
{ _
New FarPoint.Win.Spread.Model.CellRange(-1, 2, -1, 1), _
New FarPoint.Win.Spread.Model.CellRange(-1, 3, -1, 1) _
}, _
New FarPoint.Win.Spread.IConditionalFormattingRule() { _
New FarPoint.Win.Spread.FormulaConditionalFormattingRule("$B1=True", True) With {.BackColor = Color.Aqua}})
' 行をフィルタリングします。
' ※以下のコードでは、C列の値が"False"の行のみ表示しています。
FpSpread1.ActiveSheet.SetColumnAllowFilter(2, True)
FpSpread1.ActiveSheet.AutoFilterColumn(2, False, 0)
End Sub
■再現手順(上記サンプルコードの場合)
□問題1:データ連結した列の値を編集すると例外が発生する
1) 任意のセルの値を変更します。
2) 別のセルをクリックします。
→例外が発生します。
□問題2:条件付き書式が正しく動作しない
1) 任意の行の2列目のセルにチェックを入れ、別のセルに移動します。
→同じ行の3列目と4列目の背景色が変わります(正常な動作)
2) 任意の行の2列目のセルにチェックを入れ、別のセルに移動します。
→同じ行の3列目と4列目の背景色が変わりません(条件付き書式が動作していない状態)
回避方法
Service Pack 3(v10.0.4007.2012)で修正済み。
Service Pack を適用せずに対処する方法としては、セルの編集時に発生する各種イベントを使用して、数式の自動再計算とフィルタリングの自動更新を制御する方法が有効です。
■サンプルコード(VB.NET)
Service Pack を適用せずに対処する方法としては、セルの編集時に発生する各種イベントを使用して、数式の自動再計算とフィルタリングの自動更新を制御する方法が有効です。
■サンプルコード(VB.NET)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' …(中略)…
FpSpread1.ActiveSheet.SetColumnAllowFilter(2, True)
FpSpread1.ActiveSheet.AutoFilterColumn(2, False, 0)
' ***** 以下、回避策 ******
' 数式の自動再計算を無効にします。
FpSpread1.ActiveSheet.AutoCalculation = False
End Sub
Private selfChanged As Boolean = False
Private Sub FpSpread1_Sheet1_CellChanged(sender As Object, e As SheetViewEventArgs) Handles FpSpread1_Sheet1.CellChanged
' フィルタの自動更新を無効にします。
FpSpread1.ActiveSheet.AutoFilter = False
End Sub
Private Sub FpSpread1_EditChange(sender As Object, e As EditorNotifyEventArgs) Handles FpSpread1.EditChange
' フィルタの自動更新を無効にします。
FpSpread1.ActiveSheet.AutoFilter = False
End Sub
Private Sub FpSpread1_Change(sender As Object, e As ChangeEventArgs) Handles FpSpread1.Change
If (selfChanged) Then
' Changeイベント内の処理に基づく本イベント発生は無視します。
Return
End If
' セルの編集時、セルの再計算とフィルタの再更新を実施します。
selfChanged = True
FpSpread1.ActiveSheet.AutoCalculation = True
FpSpread1.ActiveSheet.AutoCalculation = False
FpSpread1.ActiveSheet.AutoFilter = True
FpSpread1.ActiveSheet.InvalidateRowFilter(True, True)
selfChanged = False
End Sub
' …(中略)…
FpSpread1.ActiveSheet.SetColumnAllowFilter(2, True)
FpSpread1.ActiveSheet.AutoFilterColumn(2, False, 0)
' ***** 以下、回避策 ******
' 数式の自動再計算を無効にします。
FpSpread1.ActiveSheet.AutoCalculation = False
End Sub
Private selfChanged As Boolean = False
Private Sub FpSpread1_Sheet1_CellChanged(sender As Object, e As SheetViewEventArgs) Handles FpSpread1_Sheet1.CellChanged
' フィルタの自動更新を無効にします。
FpSpread1.ActiveSheet.AutoFilter = False
End Sub
Private Sub FpSpread1_EditChange(sender As Object, e As EditorNotifyEventArgs) Handles FpSpread1.EditChange
' フィルタの自動更新を無効にします。
FpSpread1.ActiveSheet.AutoFilter = False
End Sub
Private Sub FpSpread1_Change(sender As Object, e As ChangeEventArgs) Handles FpSpread1.Change
If (selfChanged) Then
' Changeイベント内の処理に基づく本イベント発生は無視します。
Return
End If
' セルの編集時、セルの再計算とフィルタの再更新を実施します。
selfChanged = True
FpSpread1.ActiveSheet.AutoCalculation = True
FpSpread1.ActiveSheet.AutoCalculation = False
FpSpread1.ActiveSheet.AutoFilter = True
FpSpread1.ActiveSheet.InvalidateRowFilter(True, True)
selfChanged = False
End Sub
旧文書番号
82736