Define DataGridView Column type Programmatically

2020-02-05 10:13发布

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条回答
ゆ 、 Hurt°
2楼-- · 2020-02-05 10:44

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.

查看更多
劫难
3楼-- · 2020-02-05 10:44

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
查看更多
放荡不羁爱自由
4楼-- · 2020-02-05 10:53

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;          
查看更多
来,给爷笑一个
5楼-- · 2020-02-05 10:55

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;
查看更多
The star\"
6楼-- · 2020-02-05 11:01

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.

查看更多
三岁会撩人
7楼-- · 2020-02-05 11:06

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 the 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.

查看更多
登录 后发表回答