DataGridViewColumn

DataGridViewの列を表します。

クラス階層

  • System.Object
    • System.Windows.Forms.DataGridViewElement

コンストラクタ

既定の状態でDataGridViewColumnを作成できます。

public DataGridViewColumn ();
DataGridViewColumn() - DataGridViewColumn コンストラクター (System.Windows.Forms) | Microsoft Learn

既存のDataGridViewCellをテンプレートとして、DataGridViewColumnを作成できます。

public DataGridViewColumn (System.Windows.Forms.DataGridViewCell cellTemplate);
DataGridViewColumn(DataGridViewCell) - DataGridViewColumn コンストラクター (System.Windows.Forms) | Microsoft Learn

プロパティ

プロパティ 内容
string Name 列を識別するための名前。大文字/小文字は区別されない
DataGridViewColumnHeaderCell HeaderCell 列のヘッダーセル
string HeaderText 列のヘッダーセルの見出し文字列
DataGridViewColumnSortMode SortMode 列の並べ替えモード。既定はAutomaticであり、ユーザーは並べ替え可能。これを無効にするには、列ごとにNotSortableにする。
DataGridViewTriState Resizable これがFalseならば、ユーザーは列の幅を調整できない。既定ではAllowUserToResizeColumnsプロパティの値を継承する。もしStateプロパティにResizableSetフラグが含まれているならば、継承されていない
string DataPropertyName DataGridViewColumnが結びつけられているデータソースのプロパティまたはデータベースの列の名前
bool IsDataBound trueならば、列がデータソースに結びつけられている
bool Visible trueならば、列が表示されている
Type ValueType 列のセルの値のデータ型。これは並べ替えやフィルタの基準となる
DataGridViewCell CellTemplate 新しいセルの作成に使用するテンプレート
Type CellType CellTemplateの型 CellType - DataGridViewColumn.cs
DataGridViewCellStyle DefaultCellStyle 列の既定のスタイル。書式などを指定できる
DataGridViewCellStyle InheritedStyle 列に現在適用されているスタイル
bool HasDefaultCellStyle DefaultCellStyleが設定されているならば、true
int Width 列の幅。既定は100。MinimumWidthより小さい値を指定すると、MinimumWidthの値が代わりに用いられる

行ヘッダーの幅は、DataGridView.RowHeadersWidthで指定する

int MinimumWidth 列の最小の幅。既定は5
float FillWeight DataGridView.AutoSizeColumnsModeが塗りつぶしモード (fill-mode) のときの列の幅。このモードではFillWeightとWidthへの変更が相互に作用する。既定は100 DataGridView コントロールの列の塗りつぶしモード - Windows Forms .NET Framework | Microsoft Learn

すべての列の合計が65535を超えるとInvalidOperationExceptionが投げられる

DataGridViewAutoSizeColumnMode AutoSizeMode 列の幅を自動調整するときに使用するサイズモード。既定はNotSetで、DataGridView.AutoSizeColumnsModeのモードが適用される
DataGridViewAutoSizeColumnMode InheritedAutoSizeMode 有効なサイズモードを得られる
int DividerWidth 区分線 (Divider) の幅。既定は0
int Index DataGridView内での相対位置。ユーザーによって並べ替えられた場合など、表示位置とは一致しないことがある
int DisplayIndex 列の表示位置
     
プロパティ - DataGridViewColumn Class (System.Windows.Forms) | Microsoft Learn

新しい列はDataGridViewColumnを継承した下表のクラスから作成すると、初期設定がされた状態で作成されます。

クラス  
DataGridViewButtonColumn  
DataGridViewCheckBoxColumn  
DataGridViewComboBoxColumn  
DataGridViewImageColumn  
DataGridViewLinkColumn  
DataGridViewTextBoxColumn  
派生 - DataGridViewColumn クラス (System.Windows.Forms) | Microsoft Learn

SortMode

DataGridViewColumnSortMode 列挙型
列挙子 並べ替えの方法 並べ替えグリフ (sorting glyph)
NotSortable プログラムでのみ並べ替え可能 列ヘッダーにはグリフの空間が含まれない
Programmatic 列ヘッダーにはグリフの空間が含まれ、SortGlyphDirectionを指定して表示する
Automatic 列ヘッダーが選択に用いられていなければ、ユーザーは列ヘッダーをクリックすることで (.NET Framework 4.7.2以降ならばF3キーを押すことでも) 並べ替えられる 列ヘッダーにはグリフの空間が含まれ、自動で表示される
DataGridViewColumnSortMode 列挙型 (System.Windows.Forms) | Microsoft Learn

DataGridViewTextBoxColumnクラスの列は既定でAutomaticで、それ以外はNotSortableです。

SortModeがAutomaticの列のセルを編集すると、その都度並べ替えが実行されます。この動作を抑止するには、一時的にSortModeをNotSortableに変更します。

Resizable

これをTrueとするとユーザーは列の幅を調整できますが、右端の列がDataGridViewの右端に接しているとき、この列の幅を大きくすることはできません。これには次のような解決法があります。

DefaultCellStyle

DataGridViewCellStyle cellStyle = column.DefaultCellStyle;

cellStyle.Format = "N2";
cellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;

DataGridViewとの連携

列の追加

// 列名と列ヘッダーテキストを指定して、列に追加
int columnIndex1 = dataGridView.Columns.Add("column1", "header1");

// 列のオブジェクトを作成して、列に追加
DataGridViewColumn column = new DataGridViewTextBoxColumn();
column.Name = "column2";
column.HeaderText = "header2";

int columnIndex2 = dataGridView.Columns.Add(column);

列のオブジェクトを作成するときはDataGridViewColumnの派生クラスとするか、テンプレートとなるDataGridViewCellを与える必要があります。

// DataGridViewColumnの派生クラスである列が、1つも含まれない
DataGridView dataGridView1 = new DataGridView();
DataGridViewColumn column = new DataGridViewColumn(); // これは派生クラスではない
dataGridView1.Columns.Add(column); // InvalidOperationException「DataGridView コントロールの列のうち少なくとも 1 つにセル テンプレートが指定されていません。(At least one of the DataGridView control's columns has no cell template.)」

// DataGridViewColumnの派生クラスではない列が含まれている
DataGridView dataGridView2 = new DataGridView();
DataGridViewColumn column1 = new DataGridViewTextBoxColumn(); // これは派生クラス
DataGridViewColumn column2 = new DataGridViewColumn();        // これは派生クラスではない
dataGridView2.Columns.Add(column1);
dataGridView2.Columns.Add(column2); // InvalidOperationException「列の CellType プロパティが null であるため、列を追加することはできません。」

// テンプレートとなるセルが与えられている
DataGridView dataGridView3 = new DataGridView();
DataGridViewCell cell = new DataGridViewTextBoxCell();
DataGridViewColumn column = new DataGridViewColumn(cell);
dataGridView3.Columns.Add(column); // ok

多数の列の追加

複数の列を一括して追加できるDataGridViewColumnCollection.AddRange()がありますが、これを用いても処理時間は短縮されません。 DataGridViewColumnCollection.AddRange(DataGridViewColumn[]) メソッド (System.Windows.Forms) | Microsoft Learn AddRange - DataGridViewColumnCollection.cs

for (int i = 0; i < 100; i++)
{
    DataGridViewColumn column = new DataGridViewTextBoxColumn();
    dataGridView.Columns.Add(column);
}

DataGridViewColumn[] columns = new DataGridViewColumn[100];
for (int i = 0; i < 100; i++)
{
    columns[i] = new DataGridViewTextBoxColumn();
}
dataGridView.Columns.AddRange(columns);

WM_SETREDRAWによる描画の停止、BeginInit()による初期化の開始の通知などはパフォーマンスに影響しません。

データソースと結びつける手順

DataGridView.DataSourceにデータソースを設定すると、既定ではデータソースのコレクションのプロパティが列として自動で追加されます。これを手動で行うには、データソースと結びつける前にAutoGenerateColumnsをfalseにし、列を作成するときにDataGridViewColumn.DataPropertyNameにデータソースのプロパティの名前を指定します。

そのときValueTypeがデータソースの型と異なっていると、Columnsに追加したときにデータソースの型に自動で変更されます。

DataTable table = new DataTable();
dataGridView.AutoGenerateColumns = false;
dataGridView.DataSource = table;

DataColumn dataColumn = new DataColumn();
dataColumn.ColumnName = "TEST";
dataColumn.DataType = typeof(Int32);

DataGridViewColumn dataGridViewColumn = new DataGridViewTextBoxColumn();
dataGridViewColumn.DataPropertyName = "TEST";
dataGridViewColumn.ValueType = typeof(String); // String

table.Columns.Add(dataColumn);
dataGridView.Columns.Add(dataGridViewColumn);

Type type = dataGridViewColumn.ValueType; // Int32 に変更されている

DataGridViewがFormに追加されていないと、データソースと結びつけても行や列は追加されません。

DataGridView dataGridView = new DataGridView();
Form form = new Form();
//form.Controls.Add(dataGridView); // DataGridViewをFormに追加する

DataTable table = new DataTable();
table.Columns.Add();

dataGridView.DataSource = table;

int rows = dataGridView.RowCount; // 0
int columns = dataGridView.ColumnCount; // 0
Microsoft Learnから検索