Define DataGridView Column type Programmatically

93k Views Asked by At

I need a way in which I can define the column type at run-time.

Here is my code:

foreach (DataGridViewColumn column in this.dataGrid.Columns)
{
???
//i.e. column.type  = checkbox
}

How can I define the column type in this foreach loop?

6

There are 6 best solutions below

0
On BEST ANSWER

I'm not 100% certain I understand you question, but you can specify the column type when you create the column:

foreach (var definition in columnDefinitions)  // Some list of what the column types are
{
    var columnSpec = new DataColumn
        {
            DataType = definition.Type, // This is of type System.Type
            ColumnName = defintion.Name // This is of type string
        };

    this.dataGrid.Columns.Add(columnSpec);
}

If you need to change the type once it's been created - you can't do that. The best you can do is delete the columns and recreate them with the new types.

0
On

You can't change the type of a DataGridView column after it is created but there is nothing to stop you creating columns as needed at run-time.

So, depending on the logic that determines the type of each column, you create columns as needed and add them to the DataGridView.

An example of creating a checkbox column is below:

DataGridViewCheckBoxColumn col = new DataGridViewCheckBoxColumn()
dataGridView1.Columns.Add(col);

Without any more information on what determines your column types it is hard to give more advice, but you could easily use this technique with a DataTable, inspecting the type of each of its columns, or even using reflection over an object you are binding the DataGridView to.

0
On

you can assign button column also and you can assign properties also like this

    DataGridViewButtonColumn column = new DataGridViewButtonColumn();
    datagridview1.Columns.Add(column);
    column.FlatStyle = FlatStyle.System;
    column.DefaultCellStyle.ForeColor = Color.ForestGreen;          
0
On

If we consider your example;

foreach (DataGridViewColumn column in this.dataGrid.Columns)
{
    column.ValueType = typeof(DateTime);
}

But, assuming you do not want all the columns in your datagridview to be of the same type;

this.datagrid.Columns[0].ValueType = typeof(Int32);
this.datagrid.Columns[1].ValueType = typeof(String);
this.datagrid.Columns[2].ValueType = typeof(DateTime);

This is especially useful when you are using a datasource and not adding your own columns programatically.

0
On

I assume you mean when you create the DataGridView. In that case you can define it in a DataTable and hook it up to the dgv's Datasource:

For example:

var columns = new List<Tuple<string, string>>();
columns.Add(new Tuple<string, string>("Name", "System.String"));
columns.Add(new Tuple<string, string>("Selected", "System.Boolean"));
columns.Add(new Tuple<string, string>("Id", "System.Int32"));
var table = new DataTable();
columns.ForEach(c => table.Columns.Add(new DataColumn(c.Item1) { DataType = Type.GetType(c.Item2) }));
var dgv = new DataGridView();
dgv.DataSource = table;
0
On

Assuming your'e using BindingSource

var cbox = new DataGridViewCheckBoxColumn // Modify column type
{
    AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells,
    DataPropertyName = dgv.Columns["ColumnWantToChange"].Name, 
    HeaderText = "SOME HEADER NAME"
};
dgv.Columns.Add(cbox); // Add new 
var r = dgv.Columns.OfType<DataGridViewTextBoxColumn>().Where(x => x.Name == "ColumnWantToChange").FirstOrDefault();
dgv.Columns.Remove(r); // Remove the original column