作成日: 2019/01/29 最終更新日: 2023/01/17
文書種別
使用方法
詳細
C1FlexGridでは、ソートを行うと、デフォルトでは行の選択状態は保持されません。例えば1行目を選択してソートし、この行が最終行に移動した場合、ソート後のグリッドの1行目が選択されたままになります。グリッドのソートはベースとなるデータソースに適用されますが、行選択は表示されているグリッドレベルで行われるためです。
選択した行が、ソート後も保持されるようにするには、以下の手順を実行します。

1. BeforeSortイベントで、グリッドレベルでの選択行に対応するデータソース内の行のハッシュコード(*)を、リストコレクションに保存します。
* オブジェクトを識別するために使用される数値
2. AfterSortイベントで、リストコレクションに保存されたハッシュコードを元に、ソート後のデータ行に対応するグリッドレベルの行を探し出し、選択状態にします。
※下記コードは、複数行を選択した場合においても有効です。
◎サンプルコード(VB)
選択した行が、ソート後も保持されるようにするには、以下の手順を実行します。
1. BeforeSortイベントで、グリッドレベルでの選択行に対応するデータソース内の行のハッシュコード(*)を、リストコレクションに保存します。
* オブジェクトを識別するために使用される数値
2. AfterSortイベントで、リストコレクションに保存されたハッシュコードを元に、ソート後のデータ行に対応するグリッドレベルの行を探し出し、選択状態にします。
※下記コードは、複数行を選択した場合においても有効です。
◎サンプルコード(VB)
Imports C1.Win.C1FlexGrid
Public Class Form1
Dim _list As List(Of Int32)
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
' データソースを設定
Dim dt As 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 New System.Random()
For i As Integer = 1 To 10
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.ListBox
C1FlexGrid1.Select(-1, -1)
' 選択行の保存用リストを初期化
_list = New List(Of Int32)
End Sub
Private Sub C1FlexGrid1_BeforeSort(sender As Object, e As SortColEventArgs) Handles C1FlexGrid1.BeforeSort
' リストをクリア
_list.Clear()
' 選択行(複数ケースを含む)を保存
For Each _row As C1.Win.C1FlexGrid.Row In C1FlexGrid1.Rows
If _row.Selected Then
_list.Add(CType(_row.DataSource, System.Data.DataRowView).Row.GetHashCode())
End If
Next
End Sub
Private Sub C1FlexGrid1_AfterSort(sender As Object, e As C1.Win.C1FlexGrid.SortColEventArgs) Handles C1FlexGrid1.AfterSort
' グリッドレベルのデフォルトの選択範囲をクリア
C1FlexGrid1.Select(-1, -1)
' リストを元に、グリッドレベルの行を選択状態にする
For Each _row As C1.Win.C1FlexGrid.Row In C1FlexGrid1.Rows
If (Not (_row.DataSource) Is Nothing) Then
If _list.Contains(CType(_row.DataSource, System.Data.DataRowView).Row.GetHashCode()) Then
_row.Selected = True
e.Handled = True
End If
End If
Next
End Sub
End Class
◎サンプルコード(C#)Public Class Form1
Dim _list As List(Of Int32)
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
' データソースを設定
Dim dt As 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 New System.Random()
For i As Integer = 1 To 10
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.ListBox
C1FlexGrid1.Select(-1, -1)
' 選択行の保存用リストを初期化
_list = New List(Of Int32)
End Sub
Private Sub C1FlexGrid1_BeforeSort(sender As Object, e As SortColEventArgs) Handles C1FlexGrid1.BeforeSort
' リストをクリア
_list.Clear()
' 選択行(複数ケースを含む)を保存
For Each _row As C1.Win.C1FlexGrid.Row In C1FlexGrid1.Rows
If _row.Selected Then
_list.Add(CType(_row.DataSource, System.Data.DataRowView).Row.GetHashCode())
End If
Next
End Sub
Private Sub C1FlexGrid1_AfterSort(sender As Object, e As C1.Win.C1FlexGrid.SortColEventArgs) Handles C1FlexGrid1.AfterSort
' グリッドレベルのデフォルトの選択範囲をクリア
C1FlexGrid1.Select(-1, -1)
' リストを元に、グリッドレベルの行を選択状態にする
For Each _row As C1.Win.C1FlexGrid.Row In C1FlexGrid1.Rows
If (Not (_row.DataSource) Is Nothing) Then
If _list.Contains(CType(_row.DataSource, System.Data.DataRowView).Row.GetHashCode()) Then
_row.Selected = True
e.Handled = True
End If
End If
Next
End Sub
End Class
using C1.Win.C1FlexGrid;
namespace prj_C1FlexGrid
{
public partial class Form1 : Form
{
List<int> _list;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// データソースを設定
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;
System.Random r = new System.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 = C1.Win.C1FlexGrid.SelectionModeEnum.ListBox;
c1FlexGrid1.Select(-1, -1);
// 選択行の保存用リストを初期化
_list = new List();
}
private void c1FlexGrid1_BeforeSort(object sender, C1.Win.C1FlexGrid.SortColEventArgs e)
{
// リストをクリア
_list = new List<int>();
// 選択行(複数ケースを含む)を保存
foreach (C1.Win.C1FlexGrid.Row _row in c1FlexGrid1.Rows)
{
if (_row.Selected)
{
_list.Add(((System.Data.DataRowView)(_row.DataSource)).Row.GetHashCode());
}
}
}
private void c1FlexGrid1_AfterSort(object sender, C1.Win.C1FlexGrid.SortColEventArgs e)
{
// グリッドレベルのデフォルトの選択範囲をクリア
c1FlexGrid1.Select(-1, -1);
// リストを元に、グリッドレベルの行を選択状態にする
foreach (C1.Win.C1FlexGrid.Row _row in c1FlexGrid1.Rows)
{
if (!(_row.DataSource == null))
{
if ((_list.Contains(((System.Data.DataRowView)(_row.DataSource)).Row.GetHashCode())))
{
_row.Selected = true;
e.Handled = true;
}
}
}
}
}
}
namespace prj_C1FlexGrid
{
public partial class Form1 : Form
{
List<int> _list;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// データソースを設定
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;
System.Random r = new System.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 = C1.Win.C1FlexGrid.SelectionModeEnum.ListBox;
c1FlexGrid1.Select(-1, -1);
// 選択行の保存用リストを初期化
_list = new List();
}
private void c1FlexGrid1_BeforeSort(object sender, C1.Win.C1FlexGrid.SortColEventArgs e)
{
// リストをクリア
_list = new List<int>();
// 選択行(複数ケースを含む)を保存
foreach (C1.Win.C1FlexGrid.Row _row in c1FlexGrid1.Rows)
{
if (_row.Selected)
{
_list.Add(((System.Data.DataRowView)(_row.DataSource)).Row.GetHashCode());
}
}
}
private void c1FlexGrid1_AfterSort(object sender, C1.Win.C1FlexGrid.SortColEventArgs e)
{
// グリッドレベルのデフォルトの選択範囲をクリア
c1FlexGrid1.Select(-1, -1);
// リストを元に、グリッドレベルの行を選択状態にする
foreach (C1.Win.C1FlexGrid.Row _row in c1FlexGrid1.Rows)
{
if (!(_row.DataSource == null))
{
if ((_list.Contains(((System.Data.DataRowView)(_row.DataSource)).Row.GetHashCode())))
{
_row.Selected = true;
e.Handled = true;
}
}
}
}
}
}
関連情報
旧文書番号
83590