DataGridViewの列を表します。
既定の状態で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を継承した下表のクラスから作成すると、初期設定がされた状態で作成されます。これらの列が適用されるセルは、それぞれDataGridViewCellの派生クラスとなります。
クラス | |
---|---|
DataGridViewButtonColumn | |
DataGridViewCheckBoxColumn | |
DataGridViewComboBoxColumn | |
DataGridViewImageColumn | |
DataGridViewLinkColumn | |
DataGridViewTextBoxColumn |
列挙子 | 並べ替えの方法 | 並べ替えグリフ (sorting glyph) |
---|---|---|
NotSortable | プログラムでのみ並べ替え可能 | 列ヘッダーにはグリフの空間が含まれない |
Programmatic | 列ヘッダーにはグリフの空間が含まれ、SortGlyphDirectionを指定して表示する | |
Automatic | 列ヘッダーが選択に用いられていなければ、ユーザーは列ヘッダーをクリックすることで (.NET Framework 4.7.2以降ならばF3キーを押すことでも) 並べ替えられる | 列ヘッダーにはグリフの空間が含まれ、自動で表示される |
DataGridViewTextBoxColumnクラスの列は既定でAutomaticで、それ以外はNotSortableです。
SortModeがAutomaticの列のセルを編集すると、その都度並べ替えが実行されます。この動作を抑止するには、一時的にSortModeをNotSortableに変更します。
これをTrueとするとユーザーは列の幅を調整できますが、右端の列がDataGridViewの右端に接しているとき、この列の幅を大きくすることはできません。これには次のような解決法があります。
DataGridViewCellStyle cellStyle = column.DefaultCellStyle; cellStyle.Format = "N2"; cellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
// 列名と列ヘッダーテキストを指定して、列に追加 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