IsTrackingViewStateプロパティをFalseに設定し、ソートを行いたい

文書番号 : 21857     文書種別 : 使用方法     最終更新日 : 2006/06/23
文書を印刷する
対象製品
SPREAD for .NET 2.5J Web Forms Edition
詳細
IsTrackingViewStateプロパティをFalseに設定した場合、ページに埋め込まれるViewStateの量を減らすことができ、ページ表示のレスポンスを向上することができますが、ソートを実行するために必要な情報が不足しているため、SPREADのSortRowsメソッドを実行することができません。

そのため、以下のサンプルコードでは、SortRowsメソッド実行前にIsTrackingViewStateプロパティをTrueに設定し、実行後にIsTrackingViewStateプロパティをFalseに設定し、データのソートをDataViewのSortプロパティを利用して行っています。
ただし、DataViewのSortプロパティにて見た目上のソートを行っているため、データ連結したデータはソートされていません。

【VB サンプルコード】
  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ' IsTrackingViewStateをFalseに設定
    FpSpread1.ActiveSheetView.IsTrackingViewState = False
    ' データ連結
    FpSpread1.ActiveSheetView.DataSource = GetData()
    ' キー列を指定
    FpSpread1.ActiveSheetView.DataKeyField = "Item1"
    ' セル型の自動設定を無効化
    FpSpread1.ActiveSheetView.DataAutoCellTypes = False
    
    ' セル型の設定
    FpSpread1.ActiveSheetView.Columns(0).CellType = New FarPoint.Web.Spread.LabelCellType
    FpSpread1.ActiveSheetView.Columns(1).CellType = New FarPoint.Web.Spread.IntegerCellType
    FpSpread1.ActiveSheetView.Columns(2).CellType = New FarPoint.Web.Spread.DoubleCellType
    
    ' 自動ソートを許可
    FpSpread1.ActiveSheetView.AllowSort = True
    
    If Not IsPostBack Then
      For i As Integer = 0 To FpSpread1.ActiveSheetView.ColumnCount - 1
        ' 最後にソートの列をSessionに格納
        Session("SortedColumn") = -1
        ' 列ごとにソートの昇順降順情報をSessionに格納
        ' True:昇順 False:降順
        Session("SortedColumn " & CStr(i)) = False
      Next
    Else
      ' ソートインジケータの設定
      If Not (CType(Session("SortedColumn"), Int32) < 0) Then
        Dim col As Int32 = CType(Session("SortedColumn"), Int32)
        If CType(Session("SortedColumn " & CStr(col)), Boolean) Then
          FpSpread1.ActiveSheetView.SetColumnSortIndicator(col, FarPoint.Web.Spread.Model.SortIndicator.Ascending)
        Else
          FpSpread1.ActiveSheetView.SetColumnSortIndicator(col, FarPoint.Web.Spread.Model.SortIndicator.Descending)
        End If
      End If
    End If
  End Sub
  
  Private Function GetData() As DataView
    Dim dv As DataView
    dv = CType(Session("Data"), DataView)
    
    If dv Is Nothing Then
      dv = New DataView
      Dim dt As New DataTable("TEST")
      dt.Columns.Add(New DataColumn("Item1", GetType(String)))
      dt.Columns.Add(New DataColumn("Item2", GetType(Integer)))
      dt.Columns.Add(New DataColumn("Item3", GetType(Double)))
      
      Dim dr As DataRow
      dr = dt.NewRow
      dr("Item1") = "A"
      dr("Item2") = 3
      dr("Item3") = 1.1
      dt.Rows.Add(dr)
      
      dr = dt.NewRow
      dr("Item1") = "B"
      dr("Item2") = 2
      dr("Item3") = 2.2
      dt.Rows.Add(dr)
      
      dr = dt.NewRow
      dr("Item1") = "C"
      dr("Item2") = 1
      dr("Item3") = 3.3
      dt.Rows.Add(dr)
      
      dv.Table = dt
      
      Session("Data") = dv
    End If
    
    Return dv
  End Function
  
  Private Sub FpSpread1_UpdateCommand(ByVal sender As Object, ByVal e As FarPoint.Web.Spread.SpreadCommandEventArgs) Handles FpSpread1.UpdateCommand
    Dim row As Int32 = CInt(e.CommandArgument) ' 変更行を取得(View上の行番号)
    Dim dv As DataView = CType(Session("Data"), DataView)
    
    Dim sv As FarPoint.Web.Spread.SheetView = e.SheetView
    Dim keyValue As String = CStr(sv.GetDataKey(row))
    
    ' データモデル上の行番号を検索します。
    Dim rowFlag As Boolean = False
    Dim keyCol As Integer = 0 ' キー列の列番号
    Dim r As Integer
    For r = 0 To dv.Table.Rows.Count - 1
      Dim tmp As String = CStr(dv.Table.Rows(r).Item(keyCol))
      If (tmp = keyValue) Then
        rowFlag = True
        Exit For
      End If
    Next
    
    If Not rowFlag Then
      Return
    End If
    
    Dim col As Int32
    
    Dim dt As DataTable = dv.Table
    Dim dr As DataRow = dt.Rows(r)
    
    ' 変更のあった列値のみデータソースに反映
    For col = 0 To e.SheetView.ColumnCount - 1
      If (Not e.EditValues.Item(col) Is FarPoint.Web.Spread.FpSpread.Unchanged) Then
        dr.Item(col) = e.EditValues.Item(col)
      End If
    Next
    
    Session("Data") = dv
    
    e.Handled = True
  End Sub
  
  Private Sub spreadValue_SortColumnCommand(ByVal sender As Object, ByVal e As FarPoint.Web.Spread.SpreadCommandEventArgs) Handles FpSpread1.SortColumnCommand
    Dim col As Int32
    Dim asc As Boolean
    
    Dim dv As DataView = CType(Session("Data"), DataView)
    col = CType(e.CommandArgument, Int32)
    Session("SortedColumn") = col
    
    asc = Not CType(Session("SortedColumn " & CStr(col)), Boolean)
    Session("SortedColumn " & CStr(col)) = asc
    
    If asc Then
      ' 昇順にソート
      dv.Sort = dv.Table.Columns(col).ColumnName
    Else
      ' 降順にソート
      dv.Sort = dv.Table.Columns(col).ColumnName & " DESC"
    End If
    ' 一時的にIsTrackingViewStateをTrueに設定
    FpSpread1.ActiveSheetView.IsTrackingViewState = True
    ' ソート
    FpSpread1.ActiveSheetView.SortRows(col, asc, True)
    ' IsTrackingViewStateをFalseに設定
    FpSpread1.ActiveSheetView.IsTrackingViewState = False
    
    ' デフォルトのソートをキャンセル
    e.Handled = True
  End Sub


【C# サンプルコード】
    private void Page_Load(object sender, System.EventArgs e)
    {
      // IsTrackingViewStateをFalseに設定
      FpSpread1.ActiveSheetView.IsTrackingViewState = false;
      // データ連結
      FpSpread1.ActiveSheetView.DataSource = GetData();
      // キー列を指定
      FpSpread1.ActiveSheetView.DataKeyField = "Item1";
      // セル型の自動設定を無効化
      FpSpread1.ActiveSheetView.DataAutoCellTypes = false;
      
      // セル型の設定
      FpSpread1.ActiveSheetView.Columns[0].CellType = new FarPoint.Web.Spread.LabelCellType();
      FpSpread1.ActiveSheetView.Columns[1].CellType = new FarPoint.Web.Spread.IntegerCellType();
      FpSpread1.ActiveSheetView.Columns[2].CellType = new FarPoint.Web.Spread.DoubleCellType();
      
      // 自動ソートを許可
      FpSpread1.ActiveSheetView.AllowSort = true;
      if (!(IsPostBack))
      {
        for (int i = 0; i <= FpSpread1.ActiveSheetView.ColumnCount - 1; i++)
        {
          // 最後にソートされたの列をSessionに格納
          Session["SortedColumn"] = -1;
          // 列ごとにソートの昇順降順情報をSessionに格納
          // true:昇順 false:降順
          Session["SortedColumn " + System.Convert.ToString(i)] = false;
        }
      }
      else
      {
        // ソートインジケータの設定
        if (!((((Int32)(Session["SortedColumn"])) < 0)))
        {
          Int32 col = ((Int32)(Session["SortedColumn"]));
          if (((bool)(Session["SortedColumn " + System.Convert.ToString(col)])))
          {
            FpSpread1.ActiveSheetView.SetColumnSortIndicator(col, FarPoint.Web.Spread.Model.SortIndicator.Ascending);
          }
          else
          {
            FpSpread1.ActiveSheetView.SetColumnSortIndicator(col, FarPoint.Web.Spread.Model.SortIndicator.Descending);
          }
        }
      }
      
    }
    
    private DataView GetData()
    {
      DataView dv;
      dv = ((DataView)(Session["Data"]));
      if (dv == null)
      {
        dv = new DataView();
        DataTable dt = new DataTable("TEST");
        dt.Columns.Add(new DataColumn("Item1", typeof(string)));
        dt.Columns.Add(new DataColumn("Item2", typeof(int)));
        dt.Columns.Add(new DataColumn("Item3", typeof(double)));
        
        DataRow dr;
        dr = dt.NewRow();
        dr["Item1"] = "A";
        dr["Item2"] = 3;
        dr["Item3"] = 1.1;
        dt.Rows.Add(dr);
        
        dr = dt.NewRow();
        dr["Item1"] = "B";
        dr["Item2"] = 2;
        dr["Item3"] = 2.2;
        dt.Rows.Add(dr);
        
        dr = dt.NewRow();
        dr["Item1"] = "C";
        dr["Item2"] = 1;
        dr["Item3"] = 3.3;
        dt.Rows.Add(dr);
        
        dv.Table = dt;
        
        Session["Data"] = dv;
      }
      return dv;
    }
    
    private void FpSpread1_UpdateCommand(object sender, FarPoint.Web.Spread.SpreadCommandEventArgs e)
    {
      Int32 row = System.Convert.ToInt32(e.CommandArgument);
      DataView dv = ((DataView)(Session["Data"]));
      
      FarPoint.Web.Spread.SheetView sv = e.SheetView;
      string keyValue = System.Convert.ToString(sv.GetDataKey(row));
      
      // データモデル上の行番号を検索します。
      bool rowFlag = false;
      int keyCol = 0; // キー列の列番号
      int r;
      for (r = 0; r <= dv.Table.Rows.Count - 1; r++)
      {
        string tmp = System.Convert.ToString(dv.Table.Rows[r].ItemArray[keyCol]);
        if ((tmp == keyValue))
        {
          rowFlag = true;
          goto exitForStatement0;
        }
      }
      
      exitForStatement0: ;
      
      if (!(rowFlag))
      {
        return;
      }
      
      Int32 col;
      
      DataTable dt = dv.Table;
      DataRow dr = dt.Rows[r];
      
      // 変更のあった列値のみデータソースに反映
      for (col = 0; col <= e.SheetView.ColumnCount - 1; col++)
      {
        if ((!(e.EditValues[col] == FarPoint.Web.Spread.FpSpread.Unchanged)))
        {
          dr[col] = e.EditValues[col];
        }
      }
      
      Session["Data"] = dv;
      
      e.Handled = true;
    }
    
    private void FpSpread1_SortColumnCommand(object sender, FarPoint.Web.Spread.SpreadCommandEventArgs e)
    {
      Int32 col;
      bool asc;
      
      DataView dv = ((DataView)(Session["Data"]));
      col = ((Int32)(e.CommandArgument));
      Session["SortedColumn"] = col;
      
      asc = !(((bool)(Session["SortedColumn " + System.Convert.ToString(col)])));
      Session["SortedColumn " + System.Convert.ToString(col)] = asc;
      
      if (asc)
      {
        // 昇順にソート
        dv.Sort = dv.Table.Columns[col].ColumnName;
      }
      else
      {
        // 降順にソート
        dv.Sort = dv.Table.Columns[col].ColumnName + " DESC";
      }
      // 一時的にIsTrackingViewStateをTrueに設定
      FpSpread1.ActiveSheetView.IsTrackingViewState = true;
      // ソート
      FpSpread1.ActiveSheetView.SortRows(col, asc, true);
      // IsTrackingViewStateをFalseに設定
      FpSpread1.ActiveSheetView.IsTrackingViewState = false;
      // デフォルトのソートをキャンセル
      e.Handled = true;
    }
                 ・
                <略>
                 ・
    private void InitializeComponent()
    {
      this.Load += new System.EventHandler(this.Page_Load);
      //イベントの登録
      this.FpSpread1.UpdateCommand +=new FarPoint.Web.Spread.SpreadCommandEventHandler(FpSpread1_UpdateCommand);
      this.FpSpread1.SortColumnCommand +=new FarPoint.Web.Spread.SpreadCommandEventHandler(FpSpread1_SortColumnCommand);
    }
キーワード
一般

この文書は、以前は次のFAQ IDで公開されていました : 9181