繁体   English   中英

以编程方式定义DataGridView列类型

[英]Define DataGridView Column type Programmatically

我需要一种可以在运行时定义列类型的方法。

这是我的代码:

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

如何在此foreach循环中定义列类型?

我不确定是否100%理解您的问题,但是您可以在创建列时指定列类型:

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);
}

如果创建后需要更改类型,则不能执行此操作。 最好的办法是删除列,然后使用新类型重新创建它们。

如果我们考虑您的例子;

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

但是,假设您不希望datagridview中的所有列都属于同一类型;

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

当您使用数据源而不以编程方式添加自己的列时,这特别有用。

我假设您的意思是创建DataGridView时的意思。 在这种情况下,您可以在DataTable中定义它,并将其连接到dgv的Datasource:

例如:

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;

创建DataGridView列后,您无法更改它的类型,但是没有什么可以阻止您在运行时根据需要创建列。

因此,根据逻辑确定每个列的类型,您可以根据需要创建列并将其添加到DataGridView。

下面是创建复选框列的示例:

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

没有更多有关决定列类型的信息,很难提供更多建议,但是您可以轻松地将此技术与DataTable结合使用,检查其每个列的类型,甚至对要绑定数据网格视图的对象进行反射至。

您还可以分配按钮列,也可以像这样分配属性

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

假设您正在使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM