Windows フォーム DataGridView コントロールを拡張するための推奨される手順Best Practices for Scaling the Windows Forms DataGridView Control

DataGridView最大限のスケーラビリティを提供するコントロールは設計されています。The DataGridView control is designed to provide maximum scalability. 大量のデータを表示する場合は、大量のメモリを消費したり、ユーザー インターフェイス (UI) の応答性を低下させることを回避するには、このトピックで説明されているガイドラインに従ってください。If you need to display large amounts of data, you should follow the guidelines described in this topic to avoid consuming large amounts of memory or degrading the responsiveness of the user interface (UI). このトピックでは、次の問題について説明します。This topic discusses the following issues:

  • セルのスタイルを効率的に使用します。Using cell styles efficiently

  • ショートカット メニューを効率的に使用します。Using shortcut menus efficiently

  • 自動サイズ変更の効率的に使用します。Using automatic resizing efficiently

  • 選択したセル、行、および列のコレクションの効率的な使用Using the selected cells, rows, and columns collections efficiently

  • 行の共有を使用します。Using shared rows

  • 行が非共有になることを防ぐPreventing rows from becoming unshared

特別なパフォーマンスのニーズがあれば、仮想モードを実装し、独自のデータ管理操作を提供できます。If you have special performance needs, you can implement virtual mode and provide your own data management operations. 詳細については、次を参照してください。 Windows フォームの DataGridView コントロールでのデータ表示モードします。For more information, see Data Display Modes in the Windows Forms DataGridView Control.

セルのスタイルを効率的に使用します。Using Cell Styles Efficiently

各セル、行、および列には、独自のスタイル情報を持つことができます。Each cell, row, and column can have its own style information. スタイル情報が格納されているDataGridViewCellStyleオブジェクト。Style information is stored in DataGridViewCellStyle objects. 多くの個々 のセルのスタイル オブジェクトを作成するDataGridView大量のデータを使用する場合に特にに要素が、効率的にすることができます。Creating cell style objects for many individual DataGridView elements can be inefficient, especially when working with large amounts of data. パフォーマンスに影響を回避するには、次のガイドラインを使用します。To avoid a performance impact, use the following guidelines:

ショートカット メニューを効率的に使用します。Using Shortcut Menus Efficiently

各セル、行、および列には、ショートカット メニューを持つことができます。Each cell, row, and column can have its own shortcut menu. ショートカット メニューに、DataGridViewコントロールがによって表されるContextMenuStripコントロール。Shortcut menus in the DataGridView control are represented by ContextMenuStrip controls. セル スタイルのオブジェクトと同様に、多くの個々 のショートカット メニューを作成します。DataGridView要素には、パフォーマンスが低下します。Just as with cell style objects, creating shortcut menus for many individual DataGridView elements will negatively impact performance. この低下を回避するには、次のガイドラインを使用します。To avoid this penalty, use the following guidelines:

  • 個々 のセルと行のショートカット メニューを作成しないでください。Avoid creating shortcut menus for individual cells and rows. これには、行のテンプレートでは、コントロールに新しい行が追加されたときに、ショートカット メニューと複製が含まれます。This includes the row template, which is cloned along with its shortcut menu when new rows are added to the control. スケーラビリティを最大にするには、コントロールの使用のみのContextMenuStripコントロール全体の 1 つのショートカット メニューを指定するプロパティ。For maximum scalability, use only the control's ContextMenuStrip property to specify a single shortcut menu for the entire control.

  • 複数の行またはセルに複数のショートカット メニューが必要な場合は、処理、CellContextMenuStripNeededまたはRowContextMenuStripNeededイベント。If you require multiple shortcut menus for multiple rows or cells, handle the CellContextMenuStripNeeded or RowContextMenuStripNeeded events. これらのイベントでは、ショートカット メニュー オブジェクトを管理できます。 自分でパフォーマンスを調整することができます。These events let you manage the shortcut menu objects yourself, allowing you to tune performance.

自動サイズ変更の効率的に使用します。Using Automatic Resizing Efficiently

行、列、およびヘッダーに自動的にサイズを変更できるセルの内容の変更としてセルの内容全体がクリッピングなしに表示されるようします。Rows, columns, and headers can be automatically resized as cell content changes so that the entire contents of cells are displayed without clipping. サイズ変更モードを変更すると、行、列、およびヘッダーも変更できます。Changing sizing modes can also resize rows, columns, and headers. 適切なサイズを決定する、DataGridViewコントロールに対応する必要がありますの各セルの値を調べる必要があります。To determine the correct size, the DataGridView control must examine the value of each cell that it must accommodate. 大規模なデータ セットを使用する場合この分析はパフォーマンスに悪影響コントロールの自動サイズ変更が発生した場合。When working with large data sets, this analysis can negatively impact the performance of the control when automatic resizing occurs. パフォーマンスの低下を回避するには、次のガイドラインを使用します。To avoid performance penalties, use the following guidelines:

詳細については、次を参照してください。 Windows フォームの DataGridView コントロールのサイズ変更オプションします。For more information, see Sizing Options in the Windows Forms DataGridView Control.

選択したセル、行、および列のコレクションの効率的な使用Using the Selected Cells, Rows, and Columns Collections Efficiently

SelectedCells大規模な選択範囲をコレクションが効率的に実行されません。The SelectedCells collection does not perform efficiently with large selections. SelectedRowsSelectedColumnsコレクション解除することも、効率的なほどには一般的なセルよりも多くの少ない行があるため、DataGridView制御、および行よりも多くの少ない列です。The SelectedRows and SelectedColumns collections can also be inefficient, although to a lesser degree because there are many fewer rows than cells in a typical DataGridView control, and many fewer columns than rows. パフォーマンスの低下を避けるためには、これらのコレクションを使用する場合は、次のガイドラインを使用します。To avoid performance penalties when working with these collections, use the following guidelines:

使用して行を共有Using Shared Rows

効率的なメモリの使用が実現されます、DataGridView共有行を制御します。Efficient memory use is achieved in the DataGridView control through shared rows. 行のインスタンスを共有することで可能な外観と動作について多くの情報を共有、DataGridViewRowクラス。Rows will share as much information about their appearance and behavior as possible by sharing instances of the DataGridViewRow class.

行インスタンスの共有メモリを削減できますが、行を非共有になることができます簡単に。While sharing row instances saves memory, rows can easily become unshared. たとえば、たびに、ユーザーがセルを直接操作、その行は非共有になります。For example, whenever a user interacts directly with a cell, its row becomes unshared. これを回避できないため、このトピックのガイドラインは、ユーザーがプログラムを実行するたびに、データの比較的小さな部分に操作する場合にのみ、非常に大量のデータを使用する場合にのみ役立ちます。Because this cannot be avoided, the guidelines in this topic are useful only when working with very large amounts of data and only when users will interact with a relatively small part of the data each time your program is run.

行を共有することはできません、バインドされていないでDataGridViewのセルの値が含まれている場合は、制御します。A row cannot be shared in an unbound DataGridView control if any of its cells contain values. ときに、DataGridViewコントロールの外部データ ソースにバインドするか、セル オブジェクトであり、共有する行ではなく、コントロールの外側に、セルの値が格納されます仮想モードを実装して、独自のデータ ソースを提供するとします。When the DataGridView control is bound to an external data source or when you implement virtual mode and provide your own data source, the cell values are stored outside the control rather than in cell objects, allowing the rows to be shared.

すべてのセルの状態は、行の状態と、セルを含む列の状態から決定できる場合、行オブジェクトを共有のみできます。A row object can only be shared if the state of all its cells can be determined from the state of the row and the states of the columns containing the cells. その行と列の状態から不要になった推測できるように、セルの状態を変更する場合、行は共有できません。If you change the state of a cell so that it can no longer be deduced from the state of its row and column, the row cannot be shared.

たとえば、行は、次の状況で共有ことはできません。For example, a row cannot be shared in any of the following situations:

バインド モードまたは仮想モードで行うことができますツールヒントとショートカット メニューの個々 のセルを処理することによって、CellToolTipTextNeededCellContextMenuStripNeededイベント。In bound mode or virtual mode, you can provide ToolTips and shortcut menus for individual cells by handling the CellToolTipTextNeeded and CellContextMenuStripNeeded events.

DataGridViewコントロールは、自動的に行が追加されるたびに、共有行を使用する試行、DataGridViewRowCollectionします。The DataGridView control will automatically attempt to use shared rows whenever rows are added to the DataGridViewRowCollection. 行を共有することを確認するのにには、次のガイドラインを使用します。Use the following guidelines to ensure that rows are shared:

  • 呼び出すことは避け、Add(Object[])のオーバー ロード、AddメソッドとInsert(Object[])のオーバー ロード、Insertのメソッド、DataGridView.Rowsコレクション。Avoid calling the Add(Object[]) overload of the Add method and the Insert(Object[]) overload of the Insert method of the DataGridView.Rows collection. これらのオーバー ロードは、共有されていない行を自動的に作成します。These overloads automatically create unshared rows.

  • 必ずで指定された行、DataGridView.RowTemplateプロパティは、次の場合に共有できます。Be sure that the row specified in the DataGridView.RowTemplate property can be shared in the following cases:

  • 必ずによって示される行、indexSourceを呼び出すときに、パラメーターを共有できる、 AddCopyAddCopiesInsertCopy、およびInsertCopiesのメソッド、DataGridView.Rowsコレクション。Be sure that the row indicated by the indexSource parameter can be shared when calling the AddCopy, AddCopies, InsertCopy, and InsertCopies methods of the DataGridView.Rows collection.

  • 指定された行または行を共有できることを呼び出すときに必ず、Add(DataGridViewRow)のオーバー ロード、Addメソッド、AddRangeメソッド、Insert(Int32,DataGridViewRow)のオーバー ロード、Insertメソッド、およびInsertRangeのメソッドDataGridView.Rowsコレクション。Be sure that the specified row or rows can be shared when calling the Add(DataGridViewRow) overload of the Add method, the AddRange method, the Insert(Int32,DataGridViewRow) overload of the Insert method, and the InsertRange method of the DataGridView.Rows collection.

行が共有されているかどうかを調べるには、DataGridViewRowCollection.SharedRowメソッドを行オブジェクトを取得し、オブジェクトのIndexプロパティ。To determine whether a row is shared, use the DataGridViewRowCollection.SharedRow method to retrieve the row object, and then check the object's Index property. 共有の行が常にある、Indexプロパティの値は-1。Shared rows always have an Index property value of –1.

行が非共有になることを防ぐPreventing Rows from Becoming Unshared

共有された行はコードまたはユーザーのアクションの結果として非共有になります。Shared rows can become unshared as a result of code or user action. パフォーマンスに影響を避けるためには、共有が解除する行の原因を避ける必要があります。To avoid a performance impact, you should avoid causing rows to become unshared. 処理できるアプリケーションの開発中、RowUnshared行が非共有になるかのイベント。During application development, you can handle the RowUnshared event to determine when rows become unshared. これは、機能は、行の共有の問題をデバッグするときに便利です。This is useful when debugging row-sharing problems.

行が非共有になることを防ぐためには、次のガイドラインを使用します。To prevent rows from becoming unshared, use the following guidelines:

  • インデックス作成を避けるため、Rowsコレクションまたは反復処理に使用して、foreachループします。Avoid indexing the Rows collection or iterating through it with a foreach loop. 行に直接アクセスする通常必要はありません。You will not typically need to access rows directly. DataGridView 行を操作するメソッドは、行のインスタンスではなく、行のインデックスの引数を受け取ります。DataGridView methods that operate on rows take row index arguments rather than row instances. さらに、行に関連するイベント ハンドラーは、行を非共有になることを発生させることがなく操作に使用できる行のプロパティを持つイベント引数オブジェクトを受け取ります。Additionally, handlers for row-related events receive event argument objects with row properties that you can use to manipulate rows without causing them to become unshared.

  • 行オブジェクトにアクセスする必要がある場合、DataGridViewRowCollection.SharedRowメソッドと行の実際のインデックスを渡します。If you need to access a row object, use the DataGridViewRowCollection.SharedRow method and pass in the row's actual index. ただし、このメソッドを使用して取得共有行オブジェクトを変更すると、このオブジェクトを共有するすべての行が変更することに注意してください。Note, however, that modifying a shared row object retrieved through this method will modify all the rows that share this object. 新しいレコードの行とは共有されません他の行では、ただし、他の任意の行を変更するときに影響ありません。The row for new records is not shared with other rows, however, so it will not be affected when you modify any other row. 共有行で表される別の行が別のショートカット メニューにあることにも注意してください。Note also that different rows represented by a shared row may have different shortcut menus. 行の共有インスタンスから正しいショートカット メニューを取得するには使用、GetContextMenuStripメソッドと行の実際のインデックスを渡します。To retrieve the correct shortcut menu from a shared row instance, use the GetContextMenuStrip method and pass in the row's actual index. 行の共有にアクセスする場合ContextMenuStripプロパティ代わりに、-1 の場合、共有行インデックスを使用し、正しいショートカット メニューは取得しません。If you access the shared row's ContextMenuStrip property instead, it will use the shared row index of -1 and will not retrieve the correct shortcut menu.

  • インデックス作成を避けるため、DataGridViewRow.Cellsコレクション。Avoid indexing the DataGridViewRow.Cells collection. セルに直接アクセスすると、その親の行が解除された場合、新しくインスタンス化するDataGridViewRowします。Accessing a cell directly will cause its parent row to become unshared, instantiating a new DataGridViewRow. セルに関連するイベント ハンドラーは、共有が解除する行を発生させることがなくセルを操作するのに使用できるセルのプロパティを持つイベント引数オブジェクトを受け取ります。Handlers for cell-related events receive event argument objects with cell properties that you can use to manipulate cells without causing rows to become unshared. 使用することも、CurrentCellAddressセルに直接アクセスすることがなく現在のセルの行と列のインデックスを取得するプロパティ。You can also use the CurrentCellAddress property to retrieve the row and column indexes of the current cell without accessing the cell directly.

  • セル ベースの選択モードを回避します。Avoid cell-based selection modes. これらのモードでは、共有が解除する行が発生します。These modes cause rows to become unshared. 代わりに、設定、DataGridView.SelectionModeプロパティをDataGridViewSelectionMode.FullRowSelectまたはDataGridViewSelectionMode.FullColumnSelectします。Instead, set the DataGridView.SelectionMode property to DataGridViewSelectionMode.FullRowSelect or DataGridViewSelectionMode.FullColumnSelect.

  • 処理できない、DataGridViewRowCollection.CollectionChangedまたはDataGridView.RowStateChangedイベント。Do not handle the DataGridViewRowCollection.CollectionChanged or DataGridView.RowStateChanged events. これらのイベントが発生する行を非共有になります。These events cause rows to become unshared. また、呼び出さないでください、DataGridViewRowCollection.OnCollectionChangedまたはDataGridView.OnRowStateChangedメソッドで、これらのイベントを発生させます。Also, do not call the DataGridViewRowCollection.OnCollectionChanged or DataGridView.OnRowStateChanged methods, which raise these events.

  • アクセスしない、DataGridView.SelectedCellsコレクション時に、DataGridView.SelectionModeプロパティの値がFullColumnSelectColumnHeaderSelectFullRowSelect、またはRowHeaderSelectします。Do not access the DataGridView.SelectedCells collection when the DataGridView.SelectionMode property value is FullColumnSelect, ColumnHeaderSelect, FullRowSelect, or RowHeaderSelect. これにより、すべての選択した行を非共有になります。This causes all selected rows to become unshared.

  • 呼び出すのではない、DataGridView.AreAllCellsSelectedメソッド。Do not call the DataGridView.AreAllCellsSelected method. このメソッドは、共有が解除する行が発生することができます。This method can cause rows to become unshared.

  • 呼び出すのではない、DataGridView.SelectAllメソッドと、DataGridView.SelectionModeプロパティの値がCellSelectします。Do not call the DataGridView.SelectAll method when the DataGridView.SelectionMode property value is CellSelect. これにより、すべての行を非共有になります。This causes all rows to become unshared.

  • 設定しないでください、ReadOnlyまたはSelectedプロパティに、セルのfalseその列に対応するプロパティを設定するとtrueします。Do not set the ReadOnly or Selected property of a cell to false when the corresponding property in its column is set to true. これにより、すべての行を非共有になります。This causes all rows to become unshared.

  • アクセスしない、DataGridViewRowCollection.Listプロパティ。Do not access the DataGridViewRowCollection.List property. これにより、すべての行を非共有になります。This causes all rows to become unshared.

  • 呼び出すのではない、Sort(IComparer)のオーバー ロード、Sortメソッド。Do not call the Sort(IComparer) overload of the Sort method. 並べ替えるカスタム比較子を使用すると、すべての行を非共有になります。Sorting with a custom comparer causes all rows to become unshared.

関連項目See also