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

DataGridView 行、列、およびヘッダーは、さまざまな出現の結果としてサイズが変更される可能性があります。 これらの状況を次の表に示します。

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

既定では、ユーザーのサイズ変更が有効になり、自動サイズ設定が無効になり、列よりも広いセル値は表示が切り詰められます。

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

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

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

マウスを使用したサイズ変更

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

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

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 回だけサイズを変更します。 新しいサイズは、クリッピングなしですべてのセルの内容を表示するように自動的に計算されます。 ただし、InheritedAutoSizeModeFillプロパティ値を持つ列のサイズをプログラムで変更する場合は、計算されたコンテンツ ベースの幅を使用して、列FillWeightプロパティ値を比例的に調整し、実際に列の幅をこれらの新しい比率に従って計算し、すべての列がコントロールの使用可能な表示領域を埋めるようにします。

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

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

コンテンツ ベースのサイズ変更動作のカスタマイズ

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

コンテンツ ベースのサイズ設定オプション

プロパティとメソッドのサイズ設定で使用される列挙体は、コンテンツ ベースのサイズ設定に似た値を持ちます。 これらの値を使用すると、優先サイズの計算に使用するセルを制限できます。 すべてのサイズ設定列挙では、表示されるセルを参照する名前を持つ値によって、その計算が表示される行のセルに制限されます。 行の除外は、大量の行を操作する場合のパフォーマンスの低下を回避するのに役立ちます。 ヘッダーまたはヘッダー以外のセルのセル値に計算を制限することもできます。

こちらも参照ください