コントロールの再描画の抑制
コントロールに変更を行う前に再描画を停止しておき、変更を適用し終わった後で描画を再開することでパフォーマンスを改善できます。再描画の停止と再開には次のメソッドを使用します。
これらのメソッドは、System.Windows.Forms.ListBoxやSystem.Windows.Forms.DataGridViewと同じです。
- 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コントロールはテンプレートがない状態で配置されます。既定のテンプレートが必要な場合は、スマートタグから"既定のテンプレート"を選択できます。
6.0Jからは、この処理は削除されGcMultiRowコントロールはテンプレートがない状態で配置されます。既定のテンプレートが必要な場合は、スマートタグから"既定のテンプレート"を選択できます。
セルの値へのアクセス
GcMultiRow.GetValueメソッドおよび GcMultiRow.SetValueメソッドはCell.Valueプロパティよりも効率的なアクセスを提供します。たとえば、次のコードは行とセルをインスタンス化しますが、
次のコードはコントロール内の値に直接アクセスします。
同様の機能に、次のものがあります。
GcMultiRow1.Rows(0).Cells(1).Value = 1234
gcMultiRow1.Rows[0].Cells[1].Value = 1234;
次のコードはコントロール内の値に直接アクセスします。
同様の機能に、次のものがあります。
- Cell.SelectedプロパティとGcMultiRow.AddSelectionメソッドとRemoveSelectionメソッド、GcMultiRow.GetInheritedStateメソッド
- Cell.DisplayTextプロパティとGcMultiRow.GetDisplayTextメソッド
- Cell.EditedFormattedValueプロパティとGcMultiRow.GetEditedFormattedValueメソッド
- セルや行のプロパティとGcMultiRow.GetStateメソッド
行へのアクセス
セル数やセル型の参照など、すべての行で同一の情報を取得する場合、個々の行ではなくテンプレートの情報を参照すると高速に処理できます。
次のコードは、ヘッダ型セルを除くすべてのセルの値をnull(Visual BasicではNothing)にする場合の例です。
次のコードは、ヘッダ型セルを除くすべてのセルの値を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;