Windows フォーム DataGridView コントロールのサイズ変更オプション

DataGridView の行、列、ヘッダーは、さまざまな出来事の結果としてサイズが変更されます。 次の表はこれらの出来事をまとめたものです。

個数 説明
ユーザーによるサイズ変更 ユーザーは、行、列、またはヘッダーの区切り線をドラッグまたはダブルクリックして、サイズの調整を行うことができます。
コントロールのサイズ変更 列フィル モードでは、コントロールの幅が変化すると列の幅が変化します。たとえば、コントロールが親フォームにドッキングされていて、ユーザーがフォームのサイズを変更した場合などです。
セルの値の変更 内容ベースの自動サイズ設定モードでは、新しい表示値に合わせてサイズが変更されます。
メソッド呼び出し プログラムによる内容ベースのサイズ変更を使用すると、メソッドを呼び出す時点でセルの値に基づいて便宜的なサイズ調整を行うことができます。
プロパティの設定 特定の高さと幅を設定することもできます。

既定では、ユーザーのサイズ変更は有効になり、自動サイズ設定は無効になり、列より幅の広いセル値はクリップされます。

次の表は、既定の動作の調整、または特定の効果を実現するための特定のサイズ設定オプションに使用できるシナリオを示したものです。

シナリオ 実装
水平スクロール バーを表示せずに、コントロールの幅全体を占める比較的少数の列に同じサイズのデータを表示するために、列フィル モードを使用する。 AutoSizeColumnsMode プロパティを Fillに設定します。
サイズが異なる表示値で、列フィル モードを使用する。 AutoSizeColumnsMode プロパティを Fillに設定します。 列の FillWeight プロパティを設定するか、コントロールにデータを格納した後でコントロールの AutoResizeColumns メソッドを呼び出すことによって、列の相対的な幅を初期化します。
重要度が異なる値で、列フィル モード使用する。 AutoSizeColumnsMode プロパティを Fillに設定します。 データの一部を常に表示する必要がある列の MinimumWidth に大きな値を設定するか、特定の列に対してフィル モード以外のサイズ設定オプションを使用します。
コントロールの背景が表示されないようにするために、列フィル モードを使用する。 最後の列の AutoSizeMode プロパティを Fill に設定し、他の列には他のサイズ設定オプションを使用します。 他の列によって使用される使用可能な領域が多すぎる場合は、最後の列の MinimumWidth プロパティを設定します。
固定幅の列を表示する (アイコンや ID 列など)。 列の AutoSizeModeNone に設定し、ResizableFalse に設定します。 Width プロパティを設定するか、コントロールにデータを格納した後でコントロールの AutoResizeColumn メソッドを呼び出すことによって、その幅を初期化します。
クリッピングを回避し、領域の使用を最適化するため、セルの内容が変更されるたびに、サイズを自動的に調整する。 自動サイズ設定プロパティを、内容ベースのサイズ設定モードを表す値に設定します。 大量のデータを処理するときにパフォーマンスが低下しないようにするには、表示されている行のみの計算が行われるサイズ設定モードを使用します。
多数の行を処理するときにパフォーマンスが低下しないように、表示されている行の値に合わせてサイズを調整する。 自動またはプログラムによるサイズ変更で、適切なサイズ設定モードの列挙値を使用します。 拡大縮小の間に新しく表示される行の値に合わせてサイズを調整するには、Scroll イベント ハンドラーでサイズ変更メソッドを呼び出します。 表示されている行の値だけで新しいサイズが決定されるように、ユーザーがダブルクリックしたときのサイズ変更をカスタマイズするには、RowDividerDoubleClick または ColumnDividerDoubleClick イベント ハンドラーでサイズ変更メソッドを呼び出します。
パフォーマンスの低下を避けるため、またはユーザーがサイズを変更できるようにするため、特定のときにだけ、セルの内容に合わせてサイズを調整する。 イベント ハンドラーで内容ベースのサイズ変更メソッドを呼び出します。 たとえば、バインドの後でサイズを初期化するには DataBindingComplete イベントを使用し、ユーザーの編集やバインドされたデータ ソースでの変更を補正するためにサイズを調整するには CellValidated または CellValueChanged イベントを使用します。
セルの内容が複数行の場合に行の高さを調整する。 列の幅がテキストの段落を表示するのに適していることを確認し、自動またはプログラムによる内容ベースの行のサイズ設定を使用して高さを調整します。 また、WrapMode セル スタイルの値 True を使用して、複数行の内容のセルが表示されるようにします。

通常、自動列サイズ設定モードを使用して列の幅を維持するか、行の高さを調整する前に特定の幅に設定します。

マウスによるサイズ変更

既定では、ユーザーは、セルの値に基づく自動サイズ設定モードが使用されていない行、列、ヘッダーのサイズを変更できます。 列フィル モードなど、他のモードでユーザーがサイズを変更できないようにするには、次の DataGridView プロパティを 1 つ以上設定します。

また、個々の行や列の Resizable プロパティを設定することにより、ユーザーがそのサイズを変更できないようにすることができます。 既定では、Resizable プロパティの値は、列の場合は AllowUserToResizeColumns プロパティの値に、行の場合は AllowUserToResizeRows プロパティの値に基づいています。 ただし、Resizable を明示的に True または False に設定した場合は、その行または列のコントロールの値が、指定した値でオーバーライドされます。 継承を元に戻すには、ResizableNotSet に設定します。

NotSet を指定すると値の継承が元に戻るため、行または列が Resizable コントロールに追加されていない場合を除き、NotSet プロパティで値 DataGridView が返されることはありません。 行または列の Resizable プロパティの値が継承されているかどうかを確認する必要がある場合は、その State プロパティを調べます。 State の値に ResizableSet フラグが含まれている場合、Resizable プロパティの値は継承されません。

サイズの自動設定

DataGridView コントロールには、列フィル モードと、内容ベースの自動サイズ設定という、2 種類の自動サイズ設定があります。

列フィル モードを指定すると、コントロールに表示される列は、コントロールの表示領域の幅いっぱいに表示されます。 このモードについて詳しくは、「Windows フォーム DataGridView コントロールの列フィル モード」をご覧ください。

また、セルの内容に合わせてサイズが自動的に調整されるように、行、列、ヘッダーを構成することもできます。 この場合、セルの内容が変更されるたびにサイズの調整が行われます。

注意

仮想モードを使用してカスタム データ キャッシュのセル値を維持する場合、ユーザーがセル値を編集したときは自動サイズ設定が行われますが、CellValuePushed イベント ハンドラーの外部でキャッシュされた値を変更したときは行われません。 この場合は、UpdateCellValue メソッドを呼び出して、コントロールにセルの表示を強制的に更新させ、現在の自動サイズ設定モードを適用します。

内容ベースの自動サイズ設定が 1 つのディメンションについてのみ有効になっていて(つまり、行は有効で列は無効、または列は有効で行は無効の場合)、WrapMode も有効になっている場合は、他のディメンションが変更されたときも常にサイズの調整が行われます。 たとえば、自動サイズ設定が行については有効、列については無効に構成されていて、WrapMode が有効になっている場合、ユーザーは列の区切り線をドラッグして列の幅を変更することができ、行の高さはセルの内容が完全に表示されるように自動的に調整されます。

行と列の両方が内容ベースの自動サイズ設定に構成されていて、WrapMode が有効になっている場合は、セルの内容が変更されるたびに DataGridView コントロールのサイズが調整され、新しいサイズを計算するときにセルの高さと幅の最適な比率が使用されます。

ヘッダーと行、およびコントロールの値をオーバーライドしない列に対してサイズ設定モードを構成するには、次の DataGridView プロパティの 1 つまたは複数を設定します。

個々の列のコントロールの列サイズ設定モードをオーバーライドするには、その AutoSizeMode プロパティを NotSet 以外の値に設定します。 列のサイズ設定モードは、実際には InheritedAutoSizeMode プロパティによって決定されます。 このプロパティの値は、列の AutoSizeMode プロパティの値に基づきます。ただし、その値が NotSet の場合に限り、コントロールの AutoSizeColumnsMode の値が継承されます。

大量のデータを扱うときは、内容ベースの自動サイズ設定を慎重に使用してください。 パフォーマンスの低下を回避するには、コントロールのすべての行を分析するのではなく、表示される行のみに基づいてサイズが計算される自動サイズ設定モードを使用します。 パフォーマンスを最大にするには、新しいデータが読み込まれた直後など、特定のタイミングでサイズを変更できるように、プログラムによるサイズ変更を代わりに使用します。

行または列の Visible プロパティ、あるいはコントロールの RowHeadersVisible または ColumnHeadersVisible プロパティを false に設定することにより、非表示になっている行、列、またはヘッダーには、内容ベースの自動サイズ設定モードは適用されません。 たとえば、大きなセル値に合わせて列のサイズが自動的に設定された後で、列が非表示にされた場合、大きなセル値が含まれる行が削除されても、非表示の列のサイズは変更されません。 可視性が変更されるときに自動サイズ設定は行われないため、列の Visible プロパティを true に戻しても、現在の内容に基づくサイズの再計算は行われません。

プログラムによる内容ベースのサイズ変更は、可視性に関係なく、行、列、ヘッダーに適用されます。

プログラムによるサイズ変更

自動サイズ設定が無効になっている場合は、次のプロパティを使用して、行、列、またはヘッダーの正確な幅または高さをプログラムで設定できます。

また、プログラムで次のメソッドを使用して、行、列、ヘッダーのサイズを内容に合わせて変更することもできます。

これらのメソッドでは、行、列、またはヘッダーのサイズが 1 回だけ変更され、連続したサイズ変更は構成されません。 すべてのセルの内容がクリッピングなしに表示されるよう、新しいサイズが自動的に計算されます。 ただし、InheritedAutoSizeMode プロパティの値が Fill である列のサイズをプログラムで変更すると、計算された内容ベースの幅を使用して、それに比例するように列の FillWeight プロパティの値が調整されます。その後、すべての列によってコントロールの使用可能な表示領域が埋められるように、これらの新しい比率に従って、実際の列の幅が計算されます。

プログラムによるサイズ変更は、継続的なサイズ変更によるパフォーマンスの低下を回避するのに役立ちます。 また、ユーザーがサイズ変更可能な行、列、ヘッダーや、列フィル モードの初期サイズを指定する場合にも役立ちます。

通常は、特定のタイミングでプログラムによるサイズ変更メソッドを呼び出します。 たとえば、データを読み込んだ直後にすべての列のサイズをプログラムで変更したり、特定のセルの値が変更された後で特定の行のサイズをプログラムで変更したりすることがあります。

内容ベースのサイズ設定動作のカスタマイズ

派生した DataGridView のセル、行、列の型を操作するときのサイズ設定動作は、DataGridViewCell.GetPreferredSizeDataGridViewRow.GetPreferredHeight、または DataGridViewColumn.GetPreferredWidth メソッドをオーバーライドすることにより、または派生した DataGridView コントロールの保護されたサイズ変更メソッドのオーバーロードを呼び出すことによって、カスタマイズすることができます。 セルの幅や高さが大きくなりすぎないように、保護されたサイズ変更メソッドのオーバーロードは、ペアで動作して、セルの高さと幅の最適な比率を実現するように設計されています。 たとえば、AutoResizeRows メソッドの AutoResizeRows(DataGridViewAutoSizeRowsMode,Boolean) オーバーロードを呼び出し、Boolean パラメーターに値 false を渡すと、オーバーロードによってその行におけるセルの理想的な高さと幅が計算されますが、調整されるのは行の高さのみです。 その後、列の幅を最適な計算結果に調整するには、AutoResizeColumns メソッドを呼び出す必要があります。

内容ベースのサイズ設定オプション

サイズ設定プロパティとメソッドによって使用される列挙型は、内容ベースのサイズ設定に似ています。 これらの値を使用すると、適切なサイズの計算に使用されるセルを制限できます。 すべてのサイズ設定列挙型で、表示されているセルを参照する名前を持つ値により、表示されている行のセルに計算が制限されます。 大量の行を処理するときのパフォーマンス低下を防ぐには、行を除外すると役に立ちます。 また、ヘッダーのセルまたはヘッダーではないセルのセル値に、計算を制限することもできます。

関連項目