作成日: 2023/02/14 最終更新日: 2023/02/14
文書種別
使用方法
詳細
非連結モードでは、空行(値がない=Nullの行)をすべて末尾に配置した上で、実値の行だけをソートするには、IComparer クラスを使用したカスタムソートを実装することで実現できます。
なお、非連結モードのソートではセルの色などのスタイルも同時にソートされるため、行のスタイルを一緒に移動するための特別な設定は不要です。
【メモ】
・連結モードではこのカスタム ソートを使用することができないため、このタイプのソートを実装することは困難ですのでご了承ください。
・製品収録の「SortNulls 」サンプル※もご参照いただけます。
※サンプルのインストール先
C:\Users\<名前>\Documents\ComponentOne Samples\WinForms\v4.5.2\FlexGrid\CS\SortNulls

以下に、簡単な実装コードを紹介します。
◎サンプルコード(VB)
なお、非連結モードのソートではセルの色などのスタイルも同時にソートされるため、行のスタイルを一緒に移動するための特別な設定は不要です。
【メモ】
・連結モードではこのカスタム ソートを使用することができないため、このタイプのソートを実装することは困難ですのでご了承ください。
・製品収録の「SortNulls 」サンプル※もご参照いただけます。
※サンプルのインストール先
C:\Users\<名前>\Documents\ComponentOne Samples\WinForms\v4.5.2\FlexGrid\CS\SortNulls
以下に、簡単な実装コードを紹介します。
◎サンプルコード(VB)
Imports C1.Win.C1FlexGrid
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' セルの値の設定
Dim rnd As New Random()
For i = 1 To 5
C1FlexGrid1(i, 1) = i
C1FlexGrid1(i, 2) = rnd.Next(1, 1000)
Next
' セルの背景色の設定
C1FlexGrid1.GetCellRange(1, 1).StyleNew.BackColor = Color.Aquamarine
C1FlexGrid1.GetCellRange(1, 2).StyleNew.BackColor = Color.Aquamarine
End Sub
Private Sub C1FlexGrid1_BeforeSort(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.SortColEventArgs) Handles C1FlexGrid1.BeforeSort
' 組み込みのソート機能は使用しません。
e.Cancel = True
' カスタムソートを使用します。
C1FlexGrid1.Sort(New NullComparer(C1FlexGrid1, e))
' ソート方向を示すアイコンを更新します。
C1FlexGrid1.ShowSortAt(e.Order, e.Col)
End Sub
' IComparerインタフェースを実装
' ソート方向に関わらず、値のないデータは最後にします。
Public Class NullComparer
Implements IComparer
' ** fields
Dim _flex As C1FlexGrid
Dim _order As SortFlags
Dim _col As Integer
' ** ctor
Public Sub New(ByVal flex As C1FlexGrid, ByVal e As SortColEventArgs)
_flex = flex
_order = e.Order
_col = e.Col
End Sub
' ** IComparer
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
Dim r1 As Row = x
Dim r2 As Row = y
Dim s1 As String = r1(_col)
Dim s2 As String = r2(_col)
If s1 = s2 Then
Return 0
End If
If s1 Is Nothing Then
Return +1
End If
If s2 Is Nothing Then
Return -1
End If
Dim cmp As Integer = String.Compare(s1, s2)
If (_order And SortFlags.Descending) <> 0 Then
cmp = -cmp
End If
Return cmp
End Function
End Class
End Class
◎サンプルコード(C#)
using System.Collections;
using C1.Win.C1FlexGrid;
namespace prj_C1FlexGrid
{
public partial class Form1 : Form
{
private C1.Win.C1FlexGrid.C1FlexGrid _flex;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// セルの値の設定
Random rnd = new Random();
for (var i = 1; i <= 5; i++)
{
c1FlexGrid1[i, 1] = i;
c1FlexGrid1[i, 2] = rnd.Next(1, 1000);
}
// セルの背景色の設定
c1FlexGrid1.GetCellRange(1, 1).StyleNew.BackColor = Color.Aquamarine;
c1FlexGrid1.GetCellRange(1, 2).StyleNew.BackColor = Color.Aquamarine;
}
private void c1FlexGrid1_BeforeSort(object sender, C1.Win.C1FlexGrid.SortColEventArgs e)
{
// 組み込みのソート機能は使用しません。
e.Cancel = true;
// カスタムソートを使用します。
IComparer comp = new NullComparer(sender as C1FlexGrid, e);
c1FlexGrid1.Sort(comp);
// ソート方向を示すアイコンを更新します。
c1FlexGrid1.ShowSortAt(e.Order, e.Col);
}
}
// IComparerインタフェースを実装
// ソート方向に関わらず、値のないデータは最後にします。
public class NullComparer : IComparer
{
// ** fields
C1FlexGrid _flex;
SortFlags _order;
int _col;
// ** ctor
public NullComparer(C1FlexGrid flex, SortColEventArgs e)
{
_flex = flex;
_order = e.Order;
_col = e.Col;
}
// ** IComparer
int IComparer.Compare(object o1, object o2)
{
Row r1 = o1 as Row;
Row r2 = o2 as Row;
string s1 = null;
if (r1[_col] != null) s1 = r1[_col].ToString();
string s2 = null;
if (r2[_col] != null) s2 = r2[_col].ToString();
if (s1 == s2) return 0;
if (s1 == null) return +1;
if (s2 == null) return -1;
int cmp = string.Compare(s1, s2);
if ((_order & SortFlags.Descending) != 0)
cmp = -cmp;
return cmp;
}
}
}