作成日: 2023/01/17 最終更新日: 2023/01/17
文書種別
使用方法
詳細
連結グリッドでソートを行った場合、デフォルトでは行の選択状態は保持されません。C1FlexGridのソート結果はベースとなるデータソースに適用されますが、行選択は表示されているグリッドレベルで行われるためです。
行選択モード(SelectionMode=Row)で、ソート後も行の選択状態が保持されるようにするには、以下の手順を実行します。

1. BeforeSortイベントで、グリッドレベルでの選択行に対応するデータソース内の行のハッシュコード(*1)を、リストコレクションに保存します。
* オブジェクトを識別するために使用される数値
2. AfterSortイベントで、リストコレクションに保存されたハッシュコードを元に、ソート後のデータ行に対応するグリッドレベルの行を探し出し、選択状態にします。
(メモ)
行選択モードの場合、Row.Selectedプロパティ(*2)では行の選択状態を判別できないため、BeforeSortイベントで、C1FlexGridのSelectionプロパティで選択範囲を取得し、その r1 と r2 プロパティを利用して選択行であることを判断します。
*2 SelectionMode=ListBoxの場合のみ、選択状態を取得可能。詳細は製品ヘルプの「Selected プロパティ (Row)」の項を参照してください。
◎サンプルコード(VB)
行選択モード(SelectionMode=Row)で、ソート後も行の選択状態が保持されるようにするには、以下の手順を実行します。
1. BeforeSortイベントで、グリッドレベルでの選択行に対応するデータソース内の行のハッシュコード(*1)を、リストコレクションに保存します。
* オブジェクトを識別するために使用される数値
2. AfterSortイベントで、リストコレクションに保存されたハッシュコードを元に、ソート後のデータ行に対応するグリッドレベルの行を探し出し、選択状態にします。
(メモ)
行選択モードの場合、Row.Selectedプロパティ(*2)では行の選択状態を判別できないため、BeforeSortイベントで、C1FlexGridのSelectionプロパティで選択範囲を取得し、その r1 と r2 プロパティを利用して選択行であることを判断します。
*2 SelectionMode=ListBoxの場合のみ、選択状態を取得可能。詳細は製品ヘルプの「Selected プロパティ (Row)」の項を参照してください。
◎サンプルコード(VB)
Imports C1.Win.C1FlexGrid
Public Class Form1
Dim _list As List(Of Integer)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' データソースを設定
Dim dt As DataTable = New DataTable()
dt.Columns.Add("index", GetType(Integer))
dt.Columns.Add("A", GetType(String))
dt.Columns.Add("B", GetType(String))
dt.Columns(0).Unique = True
Dim r As System.Random = New System.Random()
For i As Integer = 1 To 9
dt.Rows.Add(i, "A" & r.[Next](100).ToString(), "B" & r.[Next](100).ToString())
Next
C1FlexGrid1.DataSource = dt
' ソートの許可、選択モードの設定
C1FlexGrid1.AllowSorting = AllowSortingEnum.SingleColumn
C1FlexGrid1.SelectionMode = C1.Win.C1FlexGrid.SelectionModeEnum.Row
C1FlexGrid1.[Select](-1, -1)
' 選択行の保存用リストを初期化
_list = New List(Of Integer)()
End Sub
Private Sub C1FlexGrid1_BeforeSort(sender As Object, e As SortColEventArgs) Handles C1FlexGrid1.BeforeSort
' リストをクリア
_list.Clear()
' 選択行を保存
Dim selRange = C1FlexGrid1.Selection
For i = 0 To C1FlexGrid1.Rows.Count - 1
If selRange.r1 <= i AndAlso i <= selRange.r2 Then
Dim _row As Row = C1FlexGrid1.Rows(selRange.r1)
'_list.Add((CType(_row.DataSource), DataRowView).Row.GetHashCode())
_list.Add(CType(_row.DataSource, DataRowView).Row.GetHashCode())
End If
Next
End Sub
Private Sub C1FlexGrid1_AfterSort(sender As Object, e As SortColEventArgs) Handles C1FlexGrid1.AfterSort
' グリッドレベルのデフォルトの選択範囲をクリア
C1FlexGrid1.[Select](-1, -1)
' 選択行を設定
Dim selRange = C1FlexGrid1.Selection
For i = 0 To C1FlexGrid1.Rows.Count - 1
Dim _row As Row = C1FlexGrid1.Rows(i)
If Not _row.DataSource Is Nothing Then
If _list.Contains(CType(_row.DataSource, DataRowView).Row.GetHashCode()) Then
selRange.r1 = i
selRange.r2 = i
selRange.c1 = 1
selRange.c2 = 1
e.Handled = True
End If
End If
Next
C1FlexGrid1.Select(selRange)
End Sub
End Class
◎サンプルコード(C#)
using C1.Win.C1FlexGrid;
namespace prj_C1FlexGrid
{
public partial class Form1 : Form
{
List<int> _list;
public Form1()
{
InitializeComponent();
// データソースを設定
DataTable dt = new DataTable();
dt.Columns.Add("index", typeof(int));
dt.Columns.Add("A", typeof(string));
dt.Columns.Add("B", typeof(string));
dt.Columns[0].Unique = true;
Random r = new Random();
for (int i = 1; (i <= 10); i++)
{
dt.Rows.Add(i, "A" + r.Next(100).ToString(), "B" + r.Next(100).ToString());
}
c1FlexGrid1.DataSource = dt;
// ソートの許可、選択モードの設定
c1FlexGrid1.AllowSorting = AllowSortingEnum.SingleColumn;
c1FlexGrid1.SelectionMode = SelectionModeEnum.Row;
c1FlexGrid1.Select(-1, -1);
// 選択行の保存用リストを初期化
_list = new List<int>();
}
private void c1FlexGrid1_BeforeSort(object sender, SortColEventArgs e)
{
// リストをクリア
_list.Clear();
// 選択行を保存
var selRange = c1FlexGrid1.Selection;
for (var i = 0; i < c1FlexGrid1.Rows.Count; i++)
{
if (selRange.r1 <= i && i <= selRange.r2)
{
Row _row = c1FlexGrid1.Rows[selRange.r1];
_list.Add(((DataRowView)(_row.DataSource)).Row.GetHashCode());
}
}
}
private void c1FlexGrid1_AfterSort(object sender, SortColEventArgs e)
{
// グリッドレベルのデフォルトの選択範囲をクリア
c1FlexGrid1.Select(-1, -1);
// 選択行を設定
var selRange = c1FlexGrid1.Selection;
for (var i = 0; i < c1FlexGrid1.Rows.Count; i++)
{
Row _row = c1FlexGrid1.Rows[i];
if (!(_row.DataSource == null))
{
if (_list.Contains(((DataRowView)_row.DataSource).Row.GetHashCode()))
{
selRange.r1 = i;
selRange.r2 = i;
selRange.c1 = 1;
selRange.c2 = 1;
e.Handled = true;
}
}
}
c1FlexGrid1.Select(selRange);
}
}
}