IsTrackingViewStateプロパティをFalseに設定し、ソートを行いたい
対象製品
SPREAD for .NET 2.5J Web Forms Edition
詳細
IsTrackingViewStateプロパティをFalseに設定した場合、ページに埋め込まれるViewStateの量を減らすことができ、ページ表示のレスポンスを向上することができますが、ソートを実行するために必要な情報が不足しているため、SPREADのSortRowsメソッドを実行することができません。
そのため、以下のサンプルコードでは、SortRowsメソッド実行前にIsTrackingViewStateプロパティをTrueに設定し、実行後にIsTrackingViewStateプロパティをFalseに設定し、データのソートをDataViewのSortプロパティを利用して行っています。
ただし、DataViewのSortプロパティにて見た目上のソートを行っているため、データ連結したデータはソートされていません。
【VB サンプルコード】
【C# サンプルコード】
そのため、以下のサンプルコードでは、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
' 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);
}
{
// 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