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にする。 Automatic
DataGridViewTriState Resizable これがFalseならば、ユーザーは列の幅を調整できない。既定ではAllowUserToResizeColumnsプロパティの値を継承する。もしStateプロパティにResizableSetフラグが含まれているならば、継承されていない  
string DataPropertyName DataGridViewColumnがバインドされているデータソースのプロパティまたはデータベースの列の名前  
bool IsDataBound trueならば、列がデータソースにバインド (結びつけ) されている  
bool Visible trueならば、列が可視である  
bool Displayed trueならば、画面に現在表示されている。一部でも表示されていればtrueとなる。スクロールされることで表示されなくなると、falseとなる  
Type ValueType 列のセルの値のデータ型。これは並べ替えやフィルタの基準となるだけであり、これに反したデータも設定できる  
DataGridViewCell CellTemplate 新しいセルの作成に使用するテンプレート  
Type CellType CellTemplateの型 CellType - DataGridViewColumn.cs  
DataGridViewCellStyle DefaultCellStyle 列の既定のスタイル。書式などを指定できる  
DataGridViewCellStyle InheritedStyle 列に現在適用されているスタイル  
bool HasDefaultCellStyle DefaultCellStyleが設定されているならば、true  
int Width 列の幅。MinimumWidthより小さい値を指定すると、MinimumWidthの値が代わりに用いられる

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

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

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

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

新しい列はDataGridViewColumnを継承した下表のクラスから作成すると、初期設定がされた状態で作成されます。これらの列が適用されるセルは、それぞれDataGridViewCellの派生クラスとなります。

クラス  
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); // データソースの型は 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から検索