【表示】フィルタリングを行った後にソートを行うと、表示データの整合性が取れない
対象製品
SPREAD for .NET 2.5J Web Forms Edition
発生環境
動作保証環境と同様
状況
修正済み
詳細
フィルタリングを行った後にソートを行った場合、表示/非表示の行(表示上の行インデックス)は変わらずにデータだけが並び替わるため、フィルタリングで非表示とした行が表示されます。
下記、再現手順とサンプルコードです。
[再現手順]
1.新規WebフォームにSPREADだけを配置します。
2.下記のサンプルコードをコピーします。
3.アプリケーションを実行します。
4.1列目を任意の値でフィルタリングします。
5.2列目をダブルクリックし、ソートを行います。
6.4のフィルタリングで非表示としたデータが表示されます。
[サンプルコード]
-------------------------
Webフォームクラス
-------------------------
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Page.IsPostBack Then
Return
End If
FpSpread1.ActiveSheetView.RowCount = 20
FpSpread1.ActiveSheetView.ColumnCount = 3
FpSpread1.ActiveSheetView.PageSize = 20
Dim r As Random = New Random(DateTime.Now.Hour * DateTime.Now.Minute * DateTime.Now.Second + DateTime.Now.Millisecond)
Dim i As Integer
Dim j As Integer
For i = 0 To FpSpread1.ActiveSheetView.RowCount - 1
For j = 0 To FpSpread1.ActiveSheetView.ColumnCount - 1
' ランダムな数値データを設定します
FpSpread1.ActiveSheetView.Cells(i, j).Value = r.Next(0, 5)
Next j
Next i
FpSpread1.ActiveSheetView.AllowSort = True
Dim fcd As New FarPoint.Web.Spread.FilterColumnDefinition(0, FarPoint.Web.Spread.FilterListBehavior.SortByMostOccurrences Or FarPoint.Web.Spread.FilterListBehavior.Default)
Dim hf As New FarPoint.Web.Spread.HideRowFilter(FpSpread1.Sheets(0))
hf.AddColumn(fcd)
FpSpread1.Sheets(0).RowFilter = hf
End Sub
下記、再現手順とサンプルコードです。
[再現手順]
1.新規WebフォームにSPREADだけを配置します。
2.下記のサンプルコードをコピーします。
3.アプリケーションを実行します。
4.1列目を任意の値でフィルタリングします。
5.2列目をダブルクリックし、ソートを行います。
6.4のフィルタリングで非表示としたデータが表示されます。
[サンプルコード]
-------------------------
Webフォームクラス
-------------------------
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Page.IsPostBack Then
Return
End If
FpSpread1.ActiveSheetView.RowCount = 20
FpSpread1.ActiveSheetView.ColumnCount = 3
FpSpread1.ActiveSheetView.PageSize = 20
Dim r As Random = New Random(DateTime.Now.Hour * DateTime.Now.Minute * DateTime.Now.Second + DateTime.Now.Millisecond)
Dim i As Integer
Dim j As Integer
For i = 0 To FpSpread1.ActiveSheetView.RowCount - 1
For j = 0 To FpSpread1.ActiveSheetView.ColumnCount - 1
' ランダムな数値データを設定します
FpSpread1.ActiveSheetView.Cells(i, j).Value = r.Next(0, 5)
Next j
Next i
FpSpread1.ActiveSheetView.AllowSort = True
Dim fcd As New FarPoint.Web.Spread.FilterColumnDefinition(0, FarPoint.Web.Spread.FilterListBehavior.SortByMostOccurrences Or FarPoint.Web.Spread.FilterListBehavior.Default)
Dim hf As New FarPoint.Web.Spread.HideRowFilter(FpSpread1.Sheets(0))
hf.AddColumn(fcd)
FpSpread1.Sheets(0).RowFilter = hf
End Sub
回避方法
2006/10/15版で修正済み。
それ以前のバージョンでは、次の回避策が有効です。
ソート後にフィルタリングを再度行って対応します。
Dim sortFLG As Boolean
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Page.IsPostBack Then
Return
End If
FpSpread1.ActiveSheetView.RowCount = 20
FpSpread1.ActiveSheetView.ColumnCount = 3
FpSpread1.ActiveSheetView.PageSize = 20
Dim r As Random = New Random(DateTime.Now.Hour * DateTime.Now.Minute * DateTime.Now.Second + DateTime.Now.Millisecond)
Dim i As Integer
Dim j As Integer
For i = 0 To FpSpread1.ActiveSheetView.RowCount - 1
For j = 0 To FpSpread1.ActiveSheetView.ColumnCount - 1
' ランダムな数値データを設定します
FpSpread1.ActiveSheetView.Cells(i, j).Value = r.Next(0, 5)
Next j
Next i
FpSpread1.ActiveSheetView.AllowSort = True
Dim fcd As New FarPoint.Web.Spread.FilterColumnDefinition(0, FarPoint.Web.Spread.FilterListBehavior.SortByMostOccurrences Or FarPoint.Web.Spread.FilterListBehavior.Default)
Dim hf As New FarPoint.Web.Spread.HideRowFilter(FpSpread1.Sheets(0))
hf.AddColumn(fcd)
FpSpread1.Sheets(0).RowFilter = hf
sortFLG = False
End Sub
Private Sub FpSpread1_SortColumnCommand(ByVal sender As Object, ByVal e As FarPoint.Web.Spread.SpreadCommandEventArgs) Handles FpSpread1.SortColumnCommand
sortFLG = True
End Sub
Private Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.PreRender
' ソートされた場合はフィルタリングし直します
If sortFLG Then
Dim hf As FarPoint.Web.Spread.IRowFilter
hf = FpSpread1.ActiveSheetView.RowFilter
FpSpread1.ActiveSheetView.AutoFilterColumn(0, hf.GetColumnFilterBy(0))
sortFLG = False
End If
End Sub
それ以前のバージョンでは、次の回避策が有効です。
ソート後にフィルタリングを再度行って対応します。
Dim sortFLG As Boolean
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Page.IsPostBack Then
Return
End If
FpSpread1.ActiveSheetView.RowCount = 20
FpSpread1.ActiveSheetView.ColumnCount = 3
FpSpread1.ActiveSheetView.PageSize = 20
Dim r As Random = New Random(DateTime.Now.Hour * DateTime.Now.Minute * DateTime.Now.Second + DateTime.Now.Millisecond)
Dim i As Integer
Dim j As Integer
For i = 0 To FpSpread1.ActiveSheetView.RowCount - 1
For j = 0 To FpSpread1.ActiveSheetView.ColumnCount - 1
' ランダムな数値データを設定します
FpSpread1.ActiveSheetView.Cells(i, j).Value = r.Next(0, 5)
Next j
Next i
FpSpread1.ActiveSheetView.AllowSort = True
Dim fcd As New FarPoint.Web.Spread.FilterColumnDefinition(0, FarPoint.Web.Spread.FilterListBehavior.SortByMostOccurrences Or FarPoint.Web.Spread.FilterListBehavior.Default)
Dim hf As New FarPoint.Web.Spread.HideRowFilter(FpSpread1.Sheets(0))
hf.AddColumn(fcd)
FpSpread1.Sheets(0).RowFilter = hf
sortFLG = False
End Sub
Private Sub FpSpread1_SortColumnCommand(ByVal sender As Object, ByVal e As FarPoint.Web.Spread.SpreadCommandEventArgs) Handles FpSpread1.SortColumnCommand
sortFLG = True
End Sub
Private Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.PreRender
' ソートされた場合はフィルタリングし直します
If sortFLG Then
Dim hf As FarPoint.Web.Spread.IRowFilter
hf = FpSpread1.ActiveSheetView.RowFilter
FpSpread1.ActiveSheetView.AutoFilterColumn(0, hf.GetColumnFilterBy(0))
sortFLG = False
End If
End Sub
キーワード
SPRN05774
この文書は、以前は次のバグレポートIDで公開されていました : 6414