【操作】 フィルタで絞り込みを行った状態のシートをコピーするとエラーが発生する

文書番号 : 38189     文書種別 : 不具合     登録日 : 2015/03/04     最終更新日 : 2015/03/31
文書を印刷する
対象製品
SPREAD for ASP.NET 7.0J
状況
修正済み
詳細
フィルタで絞り込みを行った状態のシートをコピーするとエラーが発生します。

【再現手順】
1.新規WebフォームにSPREADひとつ、ボタンひとつを配置します
2.下記の再現コードを貼り付け、Web フォームを起動します
3.ヘッダ上に表示される絞り込み用のボタンをクリックし、フィルタリングを行います
4.ボタンを押下します
--- エラーが発生し、シートのコピーに失敗します

【再現コード】
------------------------------------
Webフォームクラス
------------------------------------
Public Class WebForm1
  Inherits System.Web.UI.Page

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Page.IsPostBack Then Return

    ' Sheet1の初期設定
    FpSpread1.Sheets(0).AutoFilterMode = FarPoint.Web.Spread.AutoFilterMode.Enhanced
    Dim sf1 As New FarPoint.Web.Spread.HideRowFilter(FpSpread1.Sheets(0))
    sf1.AddColumn(New FarPoint.Web.Spread.FilterColumnDefinition(0))
    FpSpread1.Sheets(0).RowFilter = sf1
    For i As Integer = 0 To FpSpread1.Sheets(0).RowCount - 1
      FpSpread1.Sheets(0).SetValue(i, 0, String.Format("A{0}", i + 1))
      FpSpread1.Sheets(0).SetValue(i, 1, String.Format("B{0}", i + 1))
    Next
  End Sub

  Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' クライアント側の変更を確定
    FpSpread1.SaveChanges()

    ' シートのコピー
    Using ms2 As New System.IO.MemoryStream()
      FpSpread1.Sheets(0).Save(ms2, False)
      ms2.Position = 0
      Dim sheet As New FarPoint.Web.Spread.SheetView()
      sheet.Open(ms2)
      sheet.SheetName = "Sheet2"
      FpSpread1.Sheets.Add(sheet)
      If ms2 IsNot Nothing Then ms2.Close()
    End Using

  End Sub
End Class
回避方法
Service Pack 3(v7.0.4017.2010)で修正済み。
Service Pack 3(v7.0.4017.2010)より前のバージョンでは次の回避方法が有効です。
------------------------------------------

新しいシートをコントロールに追加の上、既存シートからのコピーを実施することで現象の回避が可能です。

Public Class WebForm1
  Inherits System.Web.UI.Page

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Page.IsPostBack Then Return

    ' Sheet1の初期設定
    FpSpread1.Sheets(0).AutoFilterMode = FarPoint.Web.Spread.AutoFilterMode.Enhanced
    Dim sf1 As New FarPoint.Web.Spread.HideRowFilter(FpSpread1.Sheets(0))
    sf1.AddColumn(New FarPoint.Web.Spread.FilterColumnDefinition(0))
    FpSpread1.Sheets(0).RowFilter = sf1
    For i As Integer = 0 To FpSpread1.Sheets(0).RowCount - 1
      FpSpread1.Sheets(0).SetValue(i, 0, String.Format("A{0}", i + 1))
      FpSpread1.Sheets(0).SetValue(i, 1, String.Format("B{0}", i + 1))
    Next
  End Sub

  Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' クライアント側の変更を確定
    FpSpread1.SaveChanges()

    ' シートのコピー
    Using ms2 As New System.IO.MemoryStream()
      FpSpread1.Sheets(0).Save(ms2, False)
      ms2.Position = 0

      Dim sheet As New FarPoint.Web.Spread.SheetView()
      FpSpread1.Sheets(0).SheetName = "temp" 'シート名の重複を避けるためリネーム
      FpSpread1.Sheets.Add(sheet)
      sheet.Open(ms2)
      sheet.SheetName = "Sheet2"
      FpSpread1.Sheets(0).SheetName = "Sheet1" 'シート名を戻す
      If ms2 IsNot Nothing Then ms2.Close()
    End Using
  End Sub
End Class