Windows フォーム DataGridView コントロール内の列の並べ替えモード

DataGridView 列には 3 つの並べ替えモードがあります。 各列の並べ替えモードは、次の DataGridViewColumnSortMode 列挙値のいずれかに設定できる列の SortMode プロパティを介して指定されます。

DataGridViewColumnSortMode 説明
Automatic テキスト ボックス列の既定値。 列ヘッダーを選択に使用しない限り、その列ヘッダーをクリックすると自動的にこの列によって DataGridView が並べ替えられ、並べ替え順序を示すグリフが表示されます。
NotSortable テキスト ボックス以外の列の既定値。 この列はプログラムで並べ替えることができます。しかし、並べ替えのためのものではないため、並べ替えグリフ用の領域は予約されていません。
Programmatic この列はプログラムで並べ替えることができ、領域は並べ替えグリフ用に予約されています。

意味のある順序付けが可能な値が含まれている場合は、既定で NotSortable に設定される列の並べ替えモードを変更することができます。 たとえば、項目の状態を表す数値を含むデータベース列がある場合は、そのデータベース列にイメージ列をバインドすることで、これらの数値を対応するアイコンとして表示できます。 その後、DataGridView.CellFormatting イベントのハンドラーで数値セル値をイメージ表示値に変更できます。 この場合、SortMode プロパティを Automatic に設定すると、ユーザーが列を並べ替えられるようになります。 自動並べ替えを使用すると、ユーザーは、数値に対応する状態で自然な順序が使用されていない場合でも、同じ状態の項目をグループ化できます。 チェック ボックスの列は、同じ状態の項目をグループ化するために自動並べ替えが役立つもう 1 つの例です。

SortMode 設定に関係なく、プログラムを使用して任意の列または複数の列の値で DataGridView を並べ替えることができます。 プログラムによる並べ替えは、並べ替えに独自のユーザー インターフェイス (UI) を指定したり、カスタムの並べ替えを実装したりする場合に便利です。 列ヘッダーの選択を有効にするように DataGridView 選択モードを設定する場合などに、独自の並べ替え UI を指定すると便利です。 この場合、列ヘッダーを並べ替えに使用することはできませんが、引き続きヘッダーに適切な並べ替えグリフが表示されるようにするには、SortMode プロパティを Programmatic に設定します。

プログラムによる並べ替えモードに設定されている列に、並べ替えグリフが自動的に表示されることはありません。 これらの列では、DataGridViewColumnHeaderCell.SortGlyphDirection プロパティを設定することによって、自分でグリフを表示する必要があります。 カスタムの並べ替えで柔軟性が必要な場合に、これが必要となります。 たとえば、複数の列で DataGridView を並べ替える場合は、複数の並べ替えグリフを表示するか、並べ替えグリフを表示しないようにすることができます。

プログラムを使用して任意の列で DataGridView を並べ替えることはできますが、ボタン列などの一部の列には、意味のある順序付けが可能な値が含まれていない場合があります。 これらの列の場合、NotSortableSortMode プロパティ設定は並べ替えにまったく使用されないことを示します。したがって、並べ替えグリフのヘッダーに領域を予約する必要はありません。

DataGridView が並べ替えられている場合は、SortedColumn および SortOrder プロパティの値を確かめることで、並べ替え列と並べ替え順序の両方を確認できます。 これらの値は、カスタムの並べ替え操作の後では意味がありません。 カスタム並べ替えの詳細については、このトピックで後述する「カスタムの並べ替え」セクションを参照してください。

バインドされた列とバインドされていない列の両方を含む DataGridView コントロールが並べ替えられた場合、バインドされていない列の値を自動的に維持することはできません。 これらの値を維持するには、VirtualMode プロパティを true に設定し、CellValueNeeded および CellValuePushed イベントを処理することによって、仮想モードを実装する必要があります。 詳細については、「方法: Windows フォーム DataGridView コントロールで仮想モードを実装する」を参照してください。 バインド モードでのバインドされていない列による並べ替えはサポートされていません。

プログラムによる並べ替え

Sort メソッドを呼び出すことによって、プログラムで DataGridView を並べ替えることができます。

Sort メソッドの Sort(DataGridViewColumn,ListSortDirection) オーバーロードでは、パラメーターとして DataGridViewColumn および ListSortDirection 列挙値を受け取ります。 このオーバーロードは、意味のある順序付けは可能であるものの、自動並べ替え用に構成しない値を含む列で並べ替える場合に便利です。 このオーバーロードを呼び出し、SortMode プロパティ値が DataGridViewColumnSortMode.Automatic である列を渡すと、SortedColumn および SortOrder プロパティが自動的に設定され、列ヘッダーに適切な並べ替えグリフが表示されます。

注意

DataSource プロパティを設定することで、DataGridView コントロールが外部データ ソースにバインドされている場合、バインドされていない列に対して Sort(DataGridViewColumn,ListSortDirection) メソッド オーバーロードは機能しません。 また、VirtualMode プロパティが true の場合、このオーバーロードを呼び出せるのはバインドされた列に対してのみとなります。 列がデータバインドされているかどうかを判断するには、IsDataBound プロパティ値を確認します。 バインド モードでのバインドされていない列の並べ替えはサポートされていません。

カスタムの並べ替え

Sort メソッドの Sort(IComparer) オーバーロードを使用するか、SortCompare イベントを処理することで、DataGridView をカスタマイズすることができます。

Sort(IComparer) メソッド オーバーロードでは、パラメーターとして IComparer インターフェイスを実装するクラスのインスタンスを受け取ります。 このオーバーロードは、カスタムの並べ替えを指定する場合に便利です。たとえば、列の値に自然な並べ替え順序が使用されていない場合や、自然な並べ替え順序が適切でない場合などです。 この場合、自動並べ替えを使用することはできませんが、引き続き列ヘッダーをクリックしてユーザーが並べ替えられるようにすることはできます。 列ヘッダーを選択に使用しない場合でも、ColumnHeaderMouseClick イベントのハンドラーでこのオーバーロードを呼び出すことができます。

注意

Sort(IComparer) メソッド オーバーロードは、DataGridView コントロールが外部データ ソースにバインドされておらず、VirtualMode プロパティ値が false の場合にのみ機能します。 外部データ ソースにバインドされている列の並べ替えをカスタマイズするには、そのデータ ソースによって指定される並べ替え操作を使用する必要があります。 仮想モードでは、バインドされていない列に対して独自の並べ替え操作を指定する必要があります。

Sort(IComparer) メソッド オーバーロードを使用するには、IComparer インターフェイスを実装する独自のクラスを作成する必要があります。 このインターフェイスでは、Sort(IComparer) メソッド オーバーロードが呼び出されたときに DataGridViewDataGridViewRow オブジェクトを入力として渡す IComparer.Compare メソッドを実装するためのクラスが必要です。 これにより、任意の列の値に基づいて、正しい行の順序を計算できます。

Sort(IComparer) メソッド オーバーロードでは、SortedColumn および SortOrder プロパティが設定されないため、並べ替えグリフを表示するように DataGridViewColumnHeaderCell.SortGlyphDirection プロパティを常に設定する必要があります。

Sort(IComparer) メソッド オーバーロードの代わりに、SortCompare イベントのハンドラーを実装することによって、カスタムの並べ替えを指定することができます。 このイベントは、自動並べ替え用に構成された列のヘッダーをユーザーがクリックしたとき、または自分が Sort メソッドの Sort(DataGridViewColumn,ListSortDirection) オーバーロードを呼び出したときに発生します。 イベントはコントロール内の行の各ペアに対して発生します。これにより、正しい順序を計算できるようになります。

注意

DataSource プロパティが設定されている場合や、VirtualMode プロパティの値が true の場合、SortCompare イベントは発生しません。

関連項目