作成日: 2024/04/22 最終更新日: 2024/04/22
文書種別
使用方法
詳細
実行時に非常に多くの新規スタイルオブジェクトを作成すると、処理に時間がかかりパフォーマンスが悪くなることがあります。
例えば、条件文の結果に応じて都度新規スタイルオブジェクトを作成し、セルのスタイルに設定するという処理を行った場合、行数や列数が増えるにしたがって処理時間が大幅に増加します。
この場合、事前にTrue用とFalse用のスタイルを作成しておき、判定結果に応じていずれかのスタイルをセルに適用することで、処理時間を縮めることができます。
以下に、2行10000列のグリッドで、1行目と2行目の値を比較し、異なる場合に2行目のセルをオレンジ色に設定するサンプルを記載します。
都度、新規スタイルを作成すると約5秒かかりますが、事前にスタイルを作成しておけばほとんど瞬時に背景色が設定されます。

◎サンプルコード(VB)
例えば、条件文の結果に応じて都度新規スタイルオブジェクトを作成し、セルのスタイルに設定するという処理を行った場合、行数や列数が増えるにしたがって処理時間が大幅に増加します。
この場合、事前にTrue用とFalse用のスタイルを作成しておき、判定結果に応じていずれかのスタイルをセルに適用することで、処理時間を縮めることができます。
以下に、2行10000列のグリッドで、1行目と2行目の値を比較し、異なる場合に2行目のセルをオレンジ色に設定するサンプルを記載します。
都度、新規スタイルを作成すると約5秒かかりますが、事前にスタイルを作成しておけばほとんど瞬時に背景色が設定されます。
◎サンプルコード(VB)
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' C1FlexGridの設定
C1FlexGrid1.Styles.Clear()
C1FlexGrid1.Rows.Count = 3
C1FlexGrid1.Cols.Count = 10000
' データの設定
For i = 1 To C1FlexGrid1.Rows.Count - 1
For j = 1 To C1FlexGrid1.Cols.Count - 1
C1FlexGrid1(i, j) = CInt(Math.Ceiling(Rnd() * 10)) + 1
Next j
Next i
End Sub
'(1)都度スタイルを作成
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim ColNo As Integer
Dim scrollPosition As Point
Dim styleTemp As C1.Win.C1FlexGrid.CellStyle
C1FlexGrid1.Styles.Clear()
Dim stpw = Stopwatch.StartNew() ' タイマー開始
' 1行目と2行目の値が異なる場合、2行目の背景色をオレンジにする
If True Then
Dim withBlock = C1FlexGrid1
C1FlexGrid1.BeginUpdate()
scrollPosition = C1FlexGrid1.ScrollPosition
Dim loopTo = withBlock.Rows.Count - 1
For ColNo = 1 To C1FlexGrid1.Cols.Count - 1
withBlock.Col = ColNo
Dim b = CInt(C1FlexGrid1(1, ColNo)) = CInt(C1FlexGrid1(2, ColNo))
If b = True Then
styleTemp = withBlock.Styles.Add("styleTemp_2" & " - " & ColNo.ToString())
styleTemp.BackColor = SystemColors.Window
withBlock.SetCellStyle(2, ColNo, styleTemp)
Else
styleTemp = withBlock.Styles.Add("styleTemp_2" & " - " & ColNo.ToString())
styleTemp.BackColor = Color.LightSalmon
withBlock.SetCellStyle(2, ColNo, styleTemp)
End If
Next
C1FlexGrid1.ScrollPosition = scrollPosition
C1FlexGrid1.EndUpdate()
End If
stpw.[Stop]() ' タイマー停止
MessageBox.Show("Compare data set Backcolor complete! " & vbCrLf & "Timing: " & stpw.Elapsed.Seconds.ToString().ToString().ToString() & " second")
'結果:約 5 sec
End Sub
' (2)事前にスタイルを作成
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim ColNo As Integer
Dim scrollPosition As Point
C1FlexGrid1.Styles.Clear()
' 2種類のスタイルを作成
Dim styleA As C1.Win.C1FlexGrid.CellStyle = C1FlexGrid1.Styles.Add("StyleA")
styleA.BackColor = SystemColors.Window
Dim styleB As C1.Win.C1FlexGrid.CellStyle = C1FlexGrid1.Styles.Add("StyleB")
styleB.BackColor = Color.LightSalmon
Dim stpw = Stopwatch.StartNew() ' タイマー開始
' 1行目と2行目の値が異なる場合、2行目の背景色をオレンジにする
If True Then
C1FlexGrid1.BeginUpdate()
scrollPosition = C1FlexGrid1.ScrollPosition
For ColNo = 1 To C1FlexGrid1.Cols.Count - 1
C1FlexGrid1.Col = ColNo
Dim b = CInt(C1FlexGrid1(1, ColNo)) = CInt(C1FlexGrid1(2, ColNo))
If b = True Then
C1FlexGrid1.SetCellStyle(2, ColNo, "StyleA")
Else
C1FlexGrid1.SetCellStyle(2, ColNo, "StyleB")
End If
Next
C1FlexGrid1.ScrollPosition = scrollPosition
C1FlexGrid1.EndUpdate()
End If
stpw.[Stop]() ' タイマー停止
MessageBox.Show("Compare data set Backcolor complete! " & vbCrLf & "Timing: " & stpw.Elapsed.Seconds.ToString().ToString().ToString() & " second")
' 結果: 0 sec
End Sub
End Class
◎サンプルコード(C#)
using System.Diagnostics;
namespace prj_C1FlexGrid
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// C1FlexGridの設定
c1FlexGrid1.Styles.Clear();
c1FlexGrid1.Rows.Count = 3;
c1FlexGrid1.Cols.Count = 10000;
// データの設定
Random rnd = new Random();
for (int i = 1; i < c1FlexGrid1.Rows.Count; i++)
{
for (int j = 1; j < c1FlexGrid1.Cols.Count; j++)
c1FlexGrid1[i, j] = rnd.Next(5) + 1;
}
}
//(1)都度スタイルを作成
private void Button1_Click(object sender, EventArgs e)
{
int ColNo;
Point scrollPosition;
C1.Win.C1FlexGrid.CellStyle styleTemp;
c1FlexGrid1.Styles.Clear();
var stpw = Stopwatch.StartNew(); // タイマー開始
// 1行目と2行目の値が異なる場合、2行目の背景色をオレンジにする
{
var withBlock = c1FlexGrid1;
c1FlexGrid1.BeginUpdate();
scrollPosition = c1FlexGrid1.ScrollPosition;
var loopTo = withBlock.Rows.Count - 1;
for (ColNo = 1; ColNo < c1FlexGrid1.Cols.Count; ColNo++)
{
withBlock.Col = ColNo;
bool b = ((int)c1FlexGrid1[1, ColNo] == (int)c1FlexGrid1[2, ColNo]);
if (b == true)
{
styleTemp = withBlock.Styles.Add("styleTemp_2" + " - " + ColNo.ToString());
styleTemp.BackColor = SystemColors.Window;
withBlock.SetCellStyle(2, ColNo, styleTemp);
}
else
{
styleTemp = withBlock.Styles.Add("styleTemp_2" + " - " + ColNo.ToString());
styleTemp.BackColor = Color.LightSalmon;
withBlock.SetCellStyle(2, ColNo, styleTemp);
}
}
c1FlexGrid1.ScrollPosition = scrollPosition;
c1FlexGrid1.EndUpdate();
}
stpw.Stop(); // タイマー停止
MessageBox.Show("Compare data set Backcolor complete! " + "\r\n" + "Timing: " + stpw.Elapsed.Seconds.ToString() + " second");
//結果:約 5 sec
}
//(2)事前にスタイルを作成
private void Button2_Click(object sender, EventArgs e)
{
int ColNo;
Point scrollPosition;
c1FlexGrid1.Styles.Clear();
// 2種類のスタイルを作成
C1.Win.C1FlexGrid.CellStyle styleA = c1FlexGrid1.Styles.Add("StyleA");
styleA.BackColor = SystemColors.Window;
C1.Win.C1FlexGrid.CellStyle styleB = c1FlexGrid1.Styles.Add("StyleB");
styleB.BackColor = Color.LightSalmon;
var stpw = Stopwatch.StartNew(); // タイマー開始
// 1行目と2行目の値が異なる場合、2行目の背景色をオレンジにする
{
c1FlexGrid1.BeginUpdate();
scrollPosition = c1FlexGrid1.ScrollPosition;
for (ColNo = 1; ColNo < c1FlexGrid1.Cols.Count; ColNo++)
{
c1FlexGrid1.Col = ColNo;
bool b = ((int)c1FlexGrid1[1, ColNo] == (int)c1FlexGrid1[2, ColNo]);
if (b == true)
{
c1FlexGrid1.SetCellStyle(2, ColNo, "StyleA");
}
else
{
c1FlexGrid1.SetCellStyle(2, ColNo, "StyleB");
}
}
c1FlexGrid1.ScrollPosition = scrollPosition;
c1FlexGrid1.EndUpdate();
}
stpw.Stop(); // タイマー停止
MessageBox.Show("Compare data set Backcolor complete! " + "\r\n" + "Timing: " + stpw.Elapsed.Seconds.ToString() + " second");
// 結果: 0 sec
}
}
}