PowerTools MultiRow for Windows Forms 8.0J
パフォーマンスを向上するためのヒント

実行速度やメモリの利用効率を改善するために役立つコーディング例を紹介します。
コントロールの再描画の抑制
コントロールに変更を行う前に再描画を停止しておき、変更を適用し終わった後で描画を再開することでパフォーマンスを改善できます。再描画の停止と再開には次のメソッドを使用します。

  • GcMultiRow.SuspendLayoutメソッド(Control.SuspendLayoutメソッド)
  • GcMultiRow.ResumeLayoutメソッド(Control.ResumeLayoutメソッド)

これらのメソッドは、System.Windows.Forms.ListBoxやSystem.Windows.Forms.DataGridViewと同じです。

' コントロールの描画を停止する
GcMultiRow1.SuspendLayout()

' TODO: GcMultiRow コントロールに対する変更

' コントロールの描画を再開する
GcMultiRow1.ResumeLayout()
// コントロールの描画を停止する
gcMultiRow1.SuspendLayout();

// TODO: GcMultiRow コントロールに対する変更

// コントロールの描画を再開する
gcMultiRow1.ResumeLayout();
不要な初期化
旧バージョンMultiRow for Windows Forms 5.0Jでは、設計時にGcMultiRowコントロールをフォームに配置したときに既定のテンプレートを自動的に割り当てる機能がありました。もし、実行時に直ちに異なるテンプレートを割り当てる場合、この処理は不要です。コントロールから既定のテンプレートを削除するには、プロパティウィンドウでGcMultiRow.Templateプロパティから"(なし)"を選択します。
6.0Jからは、この処理は削除されGcMultiRowコントロールはテンプレートがない状態で配置されます。既定のテンプレートが必要な場合は、スマートタグから"既定のテンプレート"を選択できます。
セルの値へのアクセス
GcMultiRow.GetValueメソッドおよび GcMultiRow.SetValueメソッドはCell.Valueプロパティよりも効率的なアクセスを提供します。たとえば、次のコードは行とセルをインスタンス化しますが、

GcMultiRow1.Rows(0).Cells(1).Value = 1234
gcMultiRow1.Rows[0].Cells[1].Value = 1234;

次のコードはコントロール内の値に直接アクセスします。

GcMultiRow1.SetValue(0, 1, 1234)
gcMultiRow1.SetValue(0, 1, 1234);

同様の機能に、次のものがあります。

行へのアクセス
セル数やセル型の参照など、すべての行で同一の情報を取得する場合、個々の行ではなくテンプレートの情報を参照すると高速に処理できます。
次のコードは、ヘッダ型セルを除くすべてのセルの値をnull(Visual BasicではNothing)にする場合の例です。

Imports GrapeCity.Win.MultiRow

' 個々の行にアクセスする場合
Dim gcMultiRow As GcMultiRow = Me.GcMultiRow1
For rowIndex As Integer = 0 To gcMultiRow.RowCount - 1
    For cellIndex As Integer = 0 To gcMultiRow.Rows(rowIndex).Cells.Count - 1
        If Not TypeOf gcMultiRow(rowIndex, cellIndex) Is HeaderCell Then
             gcMultiRow.SetValue(rowIndex, cellIndex, Nothing)
        End If
     Next
Next

' テンプレートの行にアクセスする場合
Dim gcMultiRow As GcMultiRow = Me.GcMultiRow1
For rowIndex As Integer = 0 To gcMultiRow.RowCount - 1
    For cellIndex As Integer = 0 To gcMultiRow.Template.Row.Cells.Count - 1
        If Not TypeOf gcMultiRow.Template.Row.Cells(cellIndex) Is HeaderCell Then
            gcMultiRow.SetValue(rowIndex, cellIndex, Nothing)
         End If
    Next
Next
using GrapeCity.Win.MultiRow;

// 個々の行にアクセスする場合
GcMultiRow gcMultiRow = this.gcMultiRow1;
for (int rowIndex = 0; rowIndex < gcMultiRow.RowCount; rowIndex++)
{
    for (int cellIndex = 0; cellIndex < gcMultiRow.Rows[rowIndex].Cells.Count; cellIndex++)
     {
        if (!(gcMultiRow[rowIndex, cellIndex] is HeaderCell))
             gcMultiRow.SetValue(rowIndex, cellIndex, null);
    }
}

// テンプレートの行にアクセスする場合
GcMultiRow gcMultiRow = this.gcMultiRow1;
gcMultiRow.SuspendLayout();
for (int rowIndex = 0; rowIndex < gcMultiRow.RowCount; rowIndex++)
{
    for (int cellIndex = 0; cellIndex < gcMultiRow.Template.Row.Cells.Count; cellIndex++)
    {
        if (!(gcMultiRow.Template.Row[cellIndex] is HeaderCell))
             gcMultiRow.SetValue(rowIndex, cellIndex, null);
    }
}
データソースの選択
大量のデータを処理する場合は、アンバウンドモードよりもバウンドモードのほうが効率的にデータを扱えます。
セルのスタイル
すべてのセルに同一のスタイルを適用する場合は、GcMultiRow.Rows[0].Cells[0].StyleプロパティよりもGcMultiRow.DefaultCellStyleのほうが効率的に処理できます。

Imports GrapeCity.Win.MultiRow

' すべてのセルの背景色を変更する(1)
Dim gcMultiRow As GcMultiRow = Me.GcMultiRow1
For rowIndex As Integer = 0 To gcMultiRow.RowCount - 1
    For cellIndex As Integer = 0 To gcMultiRow.Rows(rowIndex).Cells.Count - 1
         gcMultiRow(rowIndex, cellIndex).Style.BackColor = Color.Azure
    Next
Next

' すべてのセルの背景色を変更する(2)
Me.gcMultiRow1.DefaultCellStyle.BackColor = Color.Azure
using GrapeCity.Win.MultiRow;

// すべてのセルの背景色を変更する(1)
GcMultiRow gcMultiRow = this.gcMultiRow1;
for (int rowIndex = 0; rowIndex < gcMultiRow.RowCount; rowIndex++)
{
    for (int cellIndex = 0; cellIndex < gcMultiRow.Template.Row.Cells.Count; cellIndex++)
    {
         gcMultiRow[rowIndex, cellIndex].Style.BackColor = Color.Azure;
    }
}

// すべてのセルの背景色を変更する(2)
this.gcMultiRow1.DefaultCellStyle.BackColor = Color.Azure;
   
参照

 

 


© 2008-2015 GrapeCity inc. All rights reserved.