FlexGrid for WinForms
ソートの操作
ソート > ソートの操作

デフォルトでは、FlexGrid のエンドユーザーは、列ヘッダーをクリックすることで、1 つの列に昇順または降順のソートを適用できます。ただし、必要に応じてコードでデータのソートを実行できる柔軟性もあります。以下のセクションでは、ソートに関するさまざまな操作を実行する方法について説明します。

2 つの列にソートが設定されているグリッド

コードによるソート

コードでソートを適用するには、C1FlexGrid クラスの Sort メソッドを呼び出します。このメソッドは、SortFlags 列挙をパラメータとして受け取ります。この列挙により、ソート順の設定、大文字小文字を区別しないなど、さまざまなソートオプションを提供できます。さまざまなオーバーロードメソッドを利用することで、1 つの列、セル範囲、行範囲、または列範囲に柔軟にソートを適用できます。

WinForms FlexGrid においてコードで列をソートし、ソートオプションを適用するには、次のコードを使用します。

//方法 1: 
//2番目の列を降順でソートします
c1FlexGrid1.Sort(C1.Win.C1FlexGrid.SortFlags.Descending, 2);
    
//方法 2:
//SortFlagを使用して複数のソートオプションを指定します
C1.Win.C1FlexGrid.SortFlags order = C1.Win.C1FlexGrid.SortFlags.Ascending | C1.Win.C1FlexGrid.SortFlags.IgnoreCase;
         
//Sortメソッドを呼び出します   
c1FlexGrid1.Sort(order, 2);
' 方法 1: 
' 2番目の列を降順でソートします
c1FlexGrid1.Sort(C1.Win.C1FlexGrid.SortFlags.Descending, 2)

' 方法 2:
' SortFlagを使用して複数のソートオプションを指定します
Dim order As C1.Win.C1FlexGrid.SortFlags = C1.Win.C1FlexGrid.SortFlags.Ascending Or C1.Win.C1FlexGrid.SortFlags.IgnoreCase

' Sortメソッドを呼び出します   
c1FlexGrid1.Sort(order, 2)  

複数の列のソート

コードを使用して、複数の列にソートを適用するには、Column クラスの Sort プロパティを使用し、SortFlagsUseColSort に設定して Sort() メソッドを呼び出します。Sort プロパティは、SortFlags 列挙に含まれる値を受け取ります。

次のコードは、コードを使用して WinForms FlexGrid の複数の列をソートする方法を示しています。

//複数の列にソートを適用します
c1FlexGrid1.Cols[2].Sort = SortFlags.Ascending;
c1FlexGrid1.Cols[3].Sort = SortFlags.Descending;
     
//Sortメソッドを呼び出します   
c1FlexGrid1.Sort(SortFlags.UseColSort, 2, 3);
'複数の列にソートを適用します
c1FlexGrid1.Cols(2).Sort = SortFlags.Ascending
c1FlexGrid1.Cols(3).Sort = SortFlags.Descending

'Sortメソッドを呼び出します   
c1FlexGrid1.Sort(SortFlags.UseColSort, 2, 3)     

ユーザーが実行時に複数の列をソートできるようにするには、C1FlexGrid クラスの AllowSorting プロパティを MultiColumn に設定します。このプロパティは、AllowSortingEnum 列挙に含まれる値を受け取ります。

次のコードは、実行時にユーザーが WinForms FlexGrid の複数の列をソートできるようにする方法を示しています。

 // グリッドの複数の列でのソートを許可します
 c1FlexGrid1.AllowSorting = AllowSortingEnum.MultiColumn;
' グリッドの複数の列でのソートを許可します
c1FlexGrid1.AllowSorting = AllowSortingEnum.MultiColumn

ソートを元に戻す/やり直す

グリッドからソートを削除するには、C1FlexGrid クラスの SortDefinition プロパティを空の文字列に設定します。

次のコードは、WinForms FlexGrid からソートを削除する方法を示しています。

 // ソートを削除します                                       
 c1FlexGrid1.SortDefinition = string.Empty;
' ソートを削除します                                       
c1FlexGrid1.SortDefinition = String.Empty         

特定の列のソートを無効にする

特定の列のソートを無効にするには、その Column オブジェクトの AllowSorting プロパティを false に設定する必要があります。

WinForms FlexGrid の特定の列のソートを無効にするには、次のコードを使用します。

// 特定の列のソートを無効にします 
c1FlexGrid1.Cols[2].AllowSorting = false;                        
' 特定の列のソートを無効にします 
c1FlexGrid1.Cols(2).AllowSorting = False        

ソート順

通常、ソートの順序は、連結モードと非連結モードで異なります。連結モードの場合は、列ヘッダーがクリックされると、データテーブルの DefaultView.Sort プロパティと同様にソートが行われます。非連結モードの場合は、String.Compare メソッドに従って列がソートされるか、カルチャによっては大文字小文字が区別されてソートされます。

WinForms FlexGrid の列のソート順を指定する方法については、次のコードを参照してください。

 C1.Win.C1FlexGrid.SortFlags order = C1.Win.C1FlexGrid.SortFlags.Ascending | C1.Win.C1FlexGrid.SortFlags.IgnoreCase;
 c1FlexGrid1.Sort(order, 2);                  
Dim order As C1.Win.C1FlexGrid.SortFlags = C1.Win.C1FlexGrid.SortFlags.Ascending Or C1.Win.C1FlexGrid.SortFlags.IgnoreCase
c1FlexGrid1.Sort(order, 2)      

カスタムソート

FlexGrid には、よく使用されるシナリオに必要なソートオプション(大文字小文字を区別しない、表示値を使用するなど)がいくつか用意されています。ただし、ソート操作の柔軟性を高めたり、ソート操作を詳細に制御する必要がある場合は、IComparer クラスを使用して、カスタムロジックを記述することもできます。たとえば、次の例では、[Name]列をファイル拡張子でソートしています。 このサンプルコードでは、ファイル拡張子でソートするためのカスタムロジックが FileNameComparer クラスで実装され、これが C1FlexGrid クラスの Sort() メソッドにパラメータとして渡されます。

次のコードは、WinForms FlexGrid の列にカスタムソートを適用する方法を示しています。

c1FlexGrid1.Sort(new FileNameComparer(c1FlexGrid1, e.Order));                           
                                        
class FileNameComparer : IComparer
 {
   C1FlexGrid c1FlexGrid1;
   bool _desc;

   // ctor
   public FileNameComparer(C1FlexGrid flex, SortFlags order)
   {
    c1FlexGrid1 = flex;
    _desc = ((order & SortFlags.Descending) != 0);
   }
        
   // IComparer
   public int Compare(object r1, object r2)
   {
     // ファイル名を取得します
     string s1 = (string)c1FlexGrid1[((Row)r1).Index, "Name"];
     string s2 = (string)c1FlexGrid1[((Row)r2).Index, "Name"];

     // 拡張機能を比較します
     int icmp = string.Compare(Path.GetExtension(s1), Path.GetExtension(s2), true);

     // ソート順(昇順または降順)を返します
     return (_desc)? -icmp: icmp;
   }
 }                
C1FlexGrid1.Sort(New FileNameComparer(C1FlexGrid1, SortFlags.Ascending))

Public Class FileNameComparer
    Implements IComparer

    Private c1FlexGrid1 As C1FlexGrid
    Private _desc As Boolean

    Public Sub New(ByVal flex As C1FlexGrid, ByVal order As SortFlags)
        c1FlexGrid1 = flex
        _desc = ((order And SortFlags.Descending) <> 0)
    End Sub

    Public Function Compare(r1 As Object, r2 As Object) As Integer Implements IComparer.Compare
        Dim s1 As String = CStr(c1FlexGrid1((CType(r1, Row)).Index, "Name"))
        Dim s2 As String = CStr(c1FlexGrid1((CType(r2, Row)).Index, "Name"))
        Dim icmp As Integer = String.Compare(Path.GetExtension(s1), Path.GetExtension(s2), True)
        Return If((_desc), -icmp, icmp)
    End Function        

カスタムソートの実装方法の詳細については、Custom Sort(カスタムソート)という名前の製品サンプルを参照してください。

メモ: ComponentOneControlPanel.exe を使用して WinForms Edition をインストールする際にサンプルをインストールした場合、前述の製品サンプルは、システムの \Documents\ComponentOne Samples\WinForms\vx.x.x\C1FlexGrid\CS にあります。