自動ソート結果をカスタマイズ

自動ソート(列ヘッダのダブルクリック)時に独自のソートを実行したい場合、SortColumnCommnadイベントのイベント引数 e の Handled プロパティをtrueに設定することで自動ソートのデフォルトの動作をキャンセルし、 SortInfoクラスを利用した独自のソートを組み込むことができます。

このサンプルではSortColumnCommnadイベントで、ソートキーを変更しています。 第1ソートキーはクリックされた列とし、第2ソートキーを「ID」列の昇順に設定しています。 この設定により、列ヘッダをクリックされた場合は、常にクリックされた列と「ID」列の昇順にソートされます。 (デフォルト動作はクリックされた列のみをソートキーとしてソートします。)

なお、自動ソートをカスタマイズした場合、ソートインジケータの表示もキャンセルされてしまうため、イメージ型セルを設定し、インジケータを表示するよう処理しています。
 
ID
氏名
カナ
生年月日
性別
血液型
部署
入社日
メールアドレス
11001亀甲 滋万キコウ シゲマ1950/02/04A人事部1972/04/01sigema_kikou@abc.co.jp
21002寒田 希世カンダ キヨ1959/06/28B人事部1981/04/01kiyo_kanda@bbb.or.jp
31003小和瀬 澄オワセ キヨ1969/03/06A人事部1991/04/01kiyo_owase@aaa.co.jp
41004宇夫 早余子ウブ サヨコ1976/07/28O人事部1998/04/01sayoko_ubu@bbb.or.jp
51005宇田津 聖智ウダツ キヨトモ1965/09/04A営業部1987/04/01kiyotomo_udatu@abc.co.jp
61006茨城 昭児イバラキ ショウジ1963/04/28O営業部1985/04/01shouzi_ibaraki@xyz.ne.jp
71007石ヶ休 椎茄イシガキュウ シイナ1953/02/21O営業部1975/04/01siina_isigagyuu@abc.co.jp
81008赤司 恵治郎アカツカサ ケイジロウ1968/08/02O経理部1990/04/01keizirou_akatukasa@abc.co.jp
91009小橋 仰一オハシ ギョウイチ1972/03/02B経理部1994/04/01gyouiti_ohasi@abc.co.jp
101010一重 公大イチジュウ コウダイ1964/04/19B経理部1986/04/01koudai_itizyuu@xyz.ne.jp
111011稲並 勝五郎イナミ ショウゴロウ1962/02/18A営業部1984/04/01shougorou_inami@bbb.or.jp
121012穎原 紀代一エイハラ キヨカズ1965/02/13O営業部1987/04/01kiyokazu_eihara@bbb.or.jp

ソースコード

別ウィンドウで表示
using System;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Configuration;

public partial class customautosort : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack) return;

        // データ連結
        DataSet ds = new DataSet();
        ds.ReadXml(MapPath("../App_Data/data.xml"));
        FpSpread1.DataSource = ds;
        
        // SPREAD初期化
        InitSpread(FpSpread1.Sheets[0]);
    }

    private void InitSpread(FarPoint.Web.Spread.SheetView sheet)
    {
        // SPREAD設定
        FpSpread1.CommandBar.Visible = false;
        FpSpread1.CssClass = "spreadStyle";
        FpSpread1.UseClipboard = false;

        // フォントサイズの設定
        sheet.DefaultStyle.Font.Size = FontUnit.Parse("80%");
        sheet.ColumnHeader.DefaultStyle.Font.Size = FontUnit.Parse("80%");
        sheet.RowHeader.DefaultStyle.Font.Size = FontUnit.Parse("80%");
        sheet.SheetCorner.DefaultStyle.Font.Size = FontUnit.Parse("80%");

        // シート設定
        sheet.PageSize = sheet.RowCount;

        // 列幅の設定
        sheet.Columns[0].Width = 36;
        sheet.Columns[1].Width = 88;
        sheet.Columns[2].Width = 91;
        sheet.Columns[3].Width = 80;
        sheet.Columns[4].Width = 50;
        sheet.Columns[5].Width = 60;
        sheet.Columns[6].Width = 50;
        sheet.Columns[7].Width = 80;
        sheet.Columns[8].Width = 181;

        // 縦方向の揃え位置を中央に設定
        sheet.DefaultStyle.VerticalAlign = VerticalAlign.Middle;

        // 自動ソート機能を有効化
        FpSpread1.ActiveSheetView.AllowSort = true;

        // 列ヘッダにカスタムイメージ型セルを設定
        for (int i = 0; i < FpSpread1.ActiveSheetView.ColumnCount; i++)
        {
            FpSpread1.ActiveSheetView.ColumnHeader.Columns[i].CellType = new FarPoint.Web.Spread.ImageCellType();
        }
    }

    protected void FpSpread1_SortColumnCommand(object sender, FarPoint.Web.Spread.SpreadCommandEventArgs e)
    {
        int col = Convert.ToInt32(e.CommandArgument);
        
        // ソート情報の作成
        FarPoint.Web.Spread.SortInfo[] sinfo = new FarPoint.Web.Spread.SortInfo[2];

        // ソートキーを「(クリックされた列)」「ID」の順で設定
        FarPoint.Web.Spread.ImageCellType ic 
            = (FarPoint.Web.Spread.ImageCellType)e.SheetView.ColumnHeader.Columns[col].CellType;      
      if (ic.ImageUrl == "uparrow.gif")
        {
            // 降順のソート情報を設定
            sinfo[0] = new FarPoint.Web.Spread.SortInfo(col, false);
            sinfo[1] = new FarPoint.Web.Spread.SortInfo(0, true);
            ic.ImageUrl = "downarrow.gif";
        }
        else
        {
            // 昇順のソート情報を設定
            sinfo[0] = new FarPoint.Web.Spread.SortInfo(col, true);
            sinfo[1] = new FarPoint.Web.Spread.SortInfo(0, true);
            ic.ImageUrl = "uparrow.gif";
        }

        for (int i = 0; i < FpSpread1.ActiveSheetView.ColumnCount; i++)
        {
            if (i != col)
            {
                FarPoint.Web.Spread.ImageCellType oc 
                    = (FarPoint.Web.Spread.ImageCellType)e.SheetView.ColumnHeader.Columns[i].CellType;
                oc.ImageUrl = null;
            }
        }

        // 複数のソートキーでソートを実行
        FpSpread1.ActiveSheetView.SortRows(0, FpSpread1.ActiveSheetView.RowCount, sinfo);
        // デフォルトソート動作をキャンセル
        e.Handled = true;
    }
}

Partial Public Class customautosort
    Inherits System.Web.UI.Page

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

        ' データ連結
        Dim ds As New System.Data.DataSet()
        ds.ReadXml(MapPath("../App_Data/data.xml"))
        FpSpread1.DataSource = ds

        ' SPREAD初期化
        InitSpread(FpSpread1.Sheets(0))
    End Sub

    Private Sub InitSpread(ByVal sheet As FarPoint.Web.Spread.SheetView)
        ' SPREAD設定
        FpSpread1.CommandBar.Visible = False
        FpSpread1.CssClass = "spreadStyle"
        FpSpread1.UseClipboard = False

        ' フォントサイズの設定
        sheet.DefaultStyle.Font.Size = FontUnit.Parse("80%")
        sheet.ColumnHeader.DefaultStyle.Font.Size = FontUnit.Parse("80%")
        sheet.RowHeader.DefaultStyle.Font.Size = FontUnit.Parse("80%")
        sheet.SheetCorner.DefaultStyle.Font.Size = FontUnit.Parse("80%")

        ' シート設定
        sheet.PageSize = sheet.RowCount

        ' 列幅の設定
        sheet.Columns(0).Width = 36
        sheet.Columns(1).Width = 88
        sheet.Columns(2).Width = 91
        sheet.Columns(3).Width = 80
        sheet.Columns(4).Width = 50
        sheet.Columns(5).Width = 60
        sheet.Columns(6).Width = 50
        sheet.Columns(7).Width = 80
        sheet.Columns(8).Width = 181

        ' 縦方向の揃え位置を中央に設定
        sheet.DefaultStyle.VerticalAlign = VerticalAlign.Middle

        ' 自動ソート機能を有効化
        FpSpread1.ActiveSheetView.AllowSort = True

        ' 列ヘッダにカスタムイメージ型セルを設定
        For i As Integer = 0 To FpSpread1.ActiveSheetView.ColumnCount - 1
            FpSpread1.ActiveSheetView.ColumnHeader.Columns(i).CellType = New FarPoint.Web.Spread.ImageCellType()
        Next
    End Sub

    Protected Sub FpSpread1_SortColumnCommand(ByVal sender As Object, ByVal e As FarPoint.Web.Spread.SpreadCommandEventArgs) Handles FpSpread1.SortColumnCommand
        Dim col As Integer = Convert.ToInt32(e.CommandArgument)

        ' ソート情報の作成
        Dim sinfo As FarPoint.Web.Spread.SortInfo() = New FarPoint.Web.Spread.SortInfo(1) {}

        ' ソートキーを「(クリックされた列)」「ID」の順で設定
        Dim ic As FarPoint.Web.Spread.ImageCellType = DirectCast(e.SheetView.ColumnHeader.Columns(col).CellType, FarPoint.Web.Spread.ImageCellType)
        If ic.ImageUrl = "uparrow.gif" Then
            ' 降順のソート情報を設定
            sinfo(0) = New FarPoint.Web.Spread.SortInfo(col, False)
            sinfo(1) = New FarPoint.Web.Spread.SortInfo(0, True)
            ic.ImageUrl = "downarrow.gif"
        Else
            ' 昇順のソート情報を設定
            sinfo(0) = New FarPoint.Web.Spread.SortInfo(col, True)
            sinfo(1) = New FarPoint.Web.Spread.SortInfo(0, True)
            ic.ImageUrl = "uparrow.gif"
        End If

        For i As Integer = 0 To FpSpread1.ActiveSheetView.ColumnCount - 1
            If i <> col Then
                Dim oc As FarPoint.Web.Spread.ImageCellType = DirectCast(e.SheetView.ColumnHeader.Columns(i).CellType, FarPoint.Web.Spread.ImageCellType)
                oc.ImageUrl = Nothing
            End If
        Next

        ' 複数のソートキーでソートを実行
        FpSpread1.ActiveSheetView.SortRows(0, FpSpread1.ActiveSheetView.RowCount, sinfo)
        ' デフォルトソート動作をキャンセル
        e.Handled = True
    End Sub
End Class
<%@ Page MasterPageFile="~/MasterPage.master" Language="c#" AutoEventWireup="true" 
         Inherits="customautosort" CodeFile="customautosort.aspx.cs" %>

<%@ Register Assembly="FarPoint.Web.SpreadJ" Namespace="FarPoint.Web.Spread" TagPrefix="FarPoint" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <farpoint:FpSpread ID="FpSpread1" runat="server" BorderColor="#A0A0A0" BorderStyle="Solid"
        BorderWidth="1px" onsortcolumncommand="FpSpread1_SortColumnCommand">
        <CommandBar BackColor="#F6F6F6" ButtonFaceColor="Control" ButtonHighlightColor="ControlLightLight"
            ButtonShadowColor="ControlDark" />
        <Sheets>
            <farpoint:SheetView SheetName="Sheet1">
            </farpoint:SheetView>
        </Sheets>
    </farpoint:FpSpread>
</asp:Content>