作成日: 2020/04/27 最終更新日: 2024/04/25
文書種別
使用方法
詳細
FlexGridのDataSourceにList(BindingListを含む)やArray、独自のリストクラスをバインドすると、ヘッダーをクリックしてもソートされません。ソートは、通常は基底のデータソース内で同じデータ型の値を比較することで行われますが、リストの場合、項目のデータ型が型パラメータで設定されるので項目間の違いの識別が困難になるためです。なお、この動作は標準のDataGridViewと同じです。
この動作を避け、ヘッダクリック時にソートを行わせる手段として以下のような方法が考えられます。
(A)DataTableとバインドする
Listの代わりに、データソースとしてDataTableを使用します。
◎サンプルコード(VB)
(B)SortableBindingListとバインドする
Listの代わりに、データソースとしてBindingListを拡張したSortableBindingListを使用します。
◎サンプルコード(VB)(抜粋)
(参照例:ITypedList インターフェイス )
本ナレッジに、上記コードを実装したサンプルを添付しますので、動作をご確認ください。
◎添付ファイル
・SortableBindingList_C1FlexGrid_VB.zip
・SortableBindingList_C1FlexGrid_CS.zip
(C)MouseClickイベント内で、基底のデータソースであるListを直接ソートする
C1FlexGridのHitTestメソッドを使用して、クリックした場所がヘッダーセルかどうかを判別し、ListのSortメソッドを使用して、全要素を直接ソートします。
◎サンプルコード(VB)
本ナレッジに、上記コードを実装したサンプルを添付しますので、動作をご確認ください。
◎添付ファイル
・MouseClick_C1FlexGrid_VB.zip
・MouseClick_C1FlexGrid_CS.zip
この動作を避け、ヘッダクリック時にソートを行わせる手段として以下のような方法が考えられます。
(A)DataTableとバインドする
Listの代わりに、データソースとしてDataTableを使用します。
◎サンプルコード(VB)
Dim lst As DataTable = New DataTable("Test")
lst.Columns.Add("ItemA", GetType(String))
lst.Columns.Add("ItemB", GetType(Integer))
For i = 0 To 9
lst.Rows.Add($"A{i}", i)
Next
lst.AcceptChanges()
C1FlexGrid1.DataSource = lst
◎サンプルコード(C#)
DataTable lst = new DataTable("Test");
lst.Columns.Add("ItemA", typeof(String));
lst.Columns.Add("ItemB", typeof(Int32));
for (var i = 0; i < 10; i++)
{
lst.Rows.Add($"A{i}", i);
}
lst.AcceptChanges();
c1FlexGrid1.DataSource = lst;
(B)SortableBindingListとバインドする
Listの代わりに、データソースとしてBindingListを拡張したSortableBindingListを使用します。
◎サンプルコード(VB)(抜粋)
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim studentList As IList(Of Student) = New List(Of Student)() From {
New Student() With {.StudentID = 3, .StudentName = "Bill"},
New Student() With {.StudentID = 4, .StudentName = "Steve"},
New Student() With {.StudentID = 1, .StudentName = "Ram"},
New Student() With {.StudentID = 2, .StudentName = "Moin"}
}
Dim _list As SortableBindingList(Of Student) = New SortableBindingList(Of Student)(studentList)
_list.Sort("StudentID", ListSortDirection.Ascending)
C1FlexGrid1.DataSource = _list
End Sub
End Class
Public Class Student
Public Property StudentID As Integer
Public Property StudentName As String
End Class
Friend Class SortableBindingList(Of tT)
Inherits BindingList(Of tT)
Friend Sub New(list As IList(Of tT))
MyBase.New(list)
End Sub
・・・以下省略・・・
◎サンプルコード(C#)(抜粋) public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
IList studentList = new List() {
new Student(){ StudentID=3, StudentName="Bill"},
new Student(){ StudentID=4, StudentName="Steve"},
new Student(){ StudentID=1, StudentName="Ram"},
new Student(){ StudentID=2, StudentName="Moin"}
};
SortableBindingList _list = new SortableBindingList(studentList);
_list.Sort("StudentID", ListSortDirection.Ascending);
c1FlexGrid1.DataSource = _list;
}
}
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
}
class SortableBindingList : BindingList
{
internal SortableBindingList(IList list) : base(list) { }
・・・以下省略・・・
※SortableBindingListクラスの詳細については、MSDNなどを参照してください。(参照例:ITypedList インターフェイス )
本ナレッジに、上記コードを実装したサンプルを添付しますので、動作をご確認ください。
◎添付ファイル
・SortableBindingList_C1FlexGrid_VB.zip
・SortableBindingList_C1FlexGrid_CS.zip
(C)MouseClickイベント内で、基底のデータソースであるListを直接ソートする
C1FlexGridのHitTestメソッドを使用して、クリックした場所がヘッダーセルかどうかを判別し、ListのSortメソッドを使用して、全要素を直接ソートします。
◎サンプルコード(VB)
Imports C1.Win.C1FlexGrid
Public Class Form1
Dim studentList As List(Of Student)
Dim sortAsc = True
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'ソートの許可
C1FlexGrid1.AllowSorting = C1.Win.C1FlexGrid.AllowSortingEnum.SingleColumn
'リストへのバインド
studentList = New List(Of Student)()
studentList.Add(New Student() With {.Name = "John"})
studentList.Add(New Student() With {.Name = "Andrew"})
studentList.Add(New Student() With {.Name = "Smith"})
studentList.Add(New Student() With {.Name = "Justin"})
studentList.Add(New Student() With {.Name = "Alec"})
C1FlexGrid1.DataSource = studentList
End Sub
Private Sub C1FlexGrid1_MouseClick(sender As Object, e As MouseEventArgs) Handles C1FlexGrid1.MouseClick
If C1FlexGrid1.HitTest(e.X, e.Y).Type = C1.Win.C1FlexGrid.HitTestTypeEnum.ColumnHeader Then
Dim info As HitTestInfo = C1FlexGrid1.HitTest(e.X, e.Y)
If C1FlexGrid1.Cols(info.Column).Name = "Name" Then
If sortAsc = True Then
C1FlexGrid1.ShowSortAt(SortFlags.Descending, info.Column)
studentList.Sort(Function(s1 As Student, s2 As Student) s1.Name.CompareTo(s2.Name))
C1FlexGrid1.DataSource = studentList
sortAsc = False
Else
studentList.Sort(Function(s1 As Student, s2 As Student) s2.Name.CompareTo(s1.Name))
C1FlexGrid1.DataSource = studentList
sortAsc = True
End If
End If
End If
End Sub
End Class
Public Class Student
Public Property Name As String
End Class
◎サンプルコード(C#)using C1.Win.C1FlexGrid;
namespace FlexGrid_Sorting
{
public partial class Form1 : Form
{
List studentList;
bool sortAsc = true;
public Form1()
{
InitializeComponent();
studentList = new List();
studentList.Add(new Student("John"));
studentList.Add(new Student("Andrew"));
studentList.Add(new Student("Smith"));
studentList.Add(new Student("Justin"));
studentList.Add(new Student("Alec"));
c1FlexGrid1.DataSource = studentList;
c1FlexGrid1.MouseClick += C1FlexGrid1_MouseClick;
}
private void C1FlexGrid1_MouseClick(object sender, MouseEventArgs e)
{
if (c1FlexGrid1.HitTest(e.X, e.Y).Type == C1.Win.C1FlexGrid.HitTestTypeEnum.ColumnHeader)
{
HitTestInfo info = c1FlexGrid1.HitTest(e.X, e.Y);
if (c1FlexGrid1.Cols[info.Column].Name == "Name")
{
if (sortAsc == true)
{
c1FlexGrid1.ShowSortAt(SortFlags.Descending, info.Column);
studentList.Sort(delegate(Student s1, Student s2) { return s1.Name.CompareTo(s2.Name); });
c1FlexGrid1.DataSource = studentList;
sortAsc = false;
}
else
{
studentList.Sort(delegate(Student s1, Student s2) { return s2.Name.CompareTo(s1.Name); });
c1FlexGrid1.DataSource = studentList;
sortAsc = true;
}
}
}
}
}
public class Student
{
public Student(string name)
{
Name = name;
}
public string Name { get; set; }
}
}
本ナレッジに、上記コードを実装したサンプルを添付しますので、動作をご確認ください。
◎添付ファイル
・MouseClick_C1FlexGrid_VB.zip
・MouseClick_C1FlexGrid_CS.zip
旧文書番号
85524