作成日: 2020/05/13 最終更新日: 2020/05/13
文書種別
使用方法
詳細
FlexGridを連結モードで使用している場合、データのソートを行っても、行やセルに設定されたスタイルはデータと共に並び替えが行われません。連結モードでのソートは基底のデータソースに対して行われ、「データの入れ物」であるグリッドはそのままになるためで、この動作は仕様となります。
※非連結モードでソートを行った場合はスタイルも同時にソートされます。
なお、一意の値を持つデータ列がグリッドに存在する場合は、BeforeSort/AfterSortイベントを利用して手動でスタイルを再設定することで、スタイルの並び替えを行うことができます。
◎サンプルコード(VB)
※非連結モードでソートを行った場合はスタイルも同時にソートされます。
なお、一意の値を持つデータ列がグリッドに存在する場合は、BeforeSort/AfterSortイベントを利用して手動でスタイルを再設定することで、スタイルの並び替えを行うことができます。
◎サンプルコード(VB)
Imports C1.Win.C1FlexGrid
Public Class Form1
Dim flex As C1FlexGrid
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' データの作成
Dim dt As DataTable = New DataTable("TEST")
dt.Columns.Add("ColumnA", GetType(Int32))
' FlexGridの設定
dt.Columns.Add("ColumnB", GetType(System.Double))
dt.Columns.Add("ColumnC", GetType(String))
Dim i As Integer
For i = 1 To 10
dt.Rows.Add(i, CType((i + 10), Double), ("B" + i.ToString))
Next
dt.AcceptChanges()
' FlexGridの設定
C1FlexGrid1.DataSource = dt
' カスタムスタイルの作成
C1FlexGrid1.Styles.Add("Violet")
C1FlexGrid1.Styles("Violet").BackColor = Color.Violet
' カスタムスタイルの適用
For i = 1 To 10
If (CType(C1FlexGrid1(i, 2), Double) > 15) Then
Dim cr As CellRange
cr = C1FlexGrid1.GetCellRange(i, 2)
cr.Style = C1FlexGrid1.Styles("Violet")
End If
Next
End Sub
' (1)カスタムスタイルを設定したセル情報を保存用グリッドに退避
Private Sub C1FlexGrid1_BeforeSort(sender As Object, e As C1.Win.C1FlexGrid.SortColEventArgs) Handles C1FlexGrid1.BeforeSort
' スタイル設定セル保存用グリッドの設定
flex = New C1FlexGrid()
flex.Rows.Count = C1FlexGrid1.Rows.Count
flex.Cols.Count = C1FlexGrid1.Cols.Count
Dim i, j As Integer
For i = C1FlexGrid1.Rows.Fixed To C1FlexGrid1.Rows.Count - 1
For j = C1FlexGrid1.Cols.Fixed To C1FlexGrid1.Cols.Count - 1
' "Violet"スタイルが設定されているか判別
Dim cr As CellRange = C1FlexGrid1.GetCellRange(i, j)
If Not cr.Style Is Nothing Then
If cr.Style.Name = "Violet" Then
' 設定されている場合:保存用グリッドの0列目に"行番号"を設定
' スタイルが設定されていたセルには文字列 "Violet"を設定
flex(i, 0) = Convert.ToString(C1FlexGrid1(i, 1))
flex(i, j) = "Violet"
cr.Style = Nothing ' 元のスタイルを一旦クリア
End If
End If
Next
Next
End Sub
' (2)ソート後のグリッドに対してスタイルを再設定
Private Sub C1FlexGrid1_AfterSort(sender As Object, e As C1.Win.C1FlexGrid.SortColEventArgs) Handles C1FlexGrid1.AfterSort
Dim i, j, k As Integer
For i = flex.Rows.Fixed To flex.Rows.Count - 1
' 保存用グリッドの0列目に"製品ID"が設定されている行を検索
If flex(i, 0) <> "" Then
' グリッドでソート後の行を検索
For j = C1FlexGrid1.Rows.Fixed To C1FlexGrid1.Rows.Count - 1
If flex(i, 0) = C1FlexGrid1(j, 1) Then
For k = C1FlexGrid1.Cols.Fixed To C1FlexGrid1.Cols.Count - 1
' スタイルが設定されていたセルを検索
If flex(i, k) = "Violet" Then
' ソート後のセルにスタイルを設定
Dim cr As CellRange
cr = C1FlexGrid1.GetCellRange(j, k)
cr.Style = C1FlexGrid1.Styles("Violet")
End If
Next
End If
Next
End If
Next
flex.Dispose()
End Sub
End Class
◎サンプルコード(C#)using C1.Win.C1FlexGrid;
namespace prj_C1FlexGrid
{
public partial class Form1 : Form
{
// スタイル設定セル保存用グリッド
C1FlexGrid flex;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// データの作成
DataTable dt = new DataTable("TEST");
dt.Columns.Add("ColumnA", typeof(Int32)); // 行番号
dt.Columns.Add("ColumnB", typeof(double));
dt.Columns.Add("ColumnC", typeof(String));
for (int i = 1; i < 11; i++)
{
dt.Rows.Add(i, (double)(i+10), ("B" + i.ToString()));
}
dt.AcceptChanges();
// FlexGridの設定
c1FlexGrid1.DataSource = dt;
// カスタムスタイルの作成
c1FlexGrid1.Styles.Add("Violet");
c1FlexGrid1.Styles["Violet"].BackColor = Color.Violet;
// カスタムスタイルの適用
for (int i=1; i < 11; i++)
{
if ((double)c1FlexGrid1[i, 2] > 15)
{
CellRange cr;
cr = c1FlexGrid1.GetCellRange(i, 2);
cr.Style = c1FlexGrid1.Styles["Violet"];
}
}
}
// (1)カスタムスタイルを設定したセル情報を保存用グリッドに退避
private void c1FlexGrid1_BeforeSort(object sender, SortColEventArgs e)
{
// スタイル設定セル保存用グリッドの設定
flex = new C1FlexGrid();
flex.Rows.Count = c1FlexGrid1.Rows.Count;
flex.Cols.Count = c1FlexGrid1.Cols.Count;
for (int i = c1FlexGrid1.Rows.Fixed; i < c1FlexGrid1.Rows.Count; i++)
{
for (int j = c1FlexGrid1.Cols.Fixed; j < c1FlexGrid1.Cols.Count; j++)
{
// "Violet"スタイルが設定されているセル情報を保存
CellRange cr;
cr = c1FlexGrid1.GetCellRange(i, j);
if ((cr.Style != null) && (cr.Style.Name == "Violet"))
{
// 設定されている場合:保存用グリッドの0列目に"行番号"を設定
// スタイルが設定されていたセルには文字列 "Violet"を設定
flex[i, 0] = c1FlexGrid1[i, 1];
flex[i, j] = "Violet";
cr.Style = null; // 元のスタイルを一旦クリア
}
}
}
}
// (2)ソート後のグリッドに対してスタイルを再設定
private void c1FlexGrid1_AfterSort(object sender, SortColEventArgs e)
{
for (int i = flex.Rows.Fixed; i < flex.Rows.Count; i++)
{
// 保存用グリッドの0列目に"製品ID"が設定されている行を検索
if ((flex[i, 0] != null) && (flex[i, 0].ToString() != ""))
{
// グリッドでソート後の行を検索
for (int j = c1FlexGrid1.Rows.Fixed; j < c1FlexGrid1.Rows.Count; j++)
{
if (flex[i, 0].ToString() == c1FlexGrid1[j, 1].ToString())
{
for (int k = c1FlexGrid1.Cols.Fixed; k < c1FlexGrid1.Cols.Count; k++)
{
// スタイルが設定されていたセルを検索
if ((flex[i, k] != null) && (flex[i, k].ToString() == "Violet"))
{
// ソート後のセルにスタイルを設定
CellRange cr;
cr = c1FlexGrid1.GetCellRange(j, k);
cr.Style = c1FlexGrid1.Styles["Violet"];
}
}
}
}
}
}
flex.Dispose();
}
}
}
旧文書番号
85563