以编程方式定义DataGridView列类型

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

这是我的代码:

foreach (DataGridViewColumn column in this.dataGrid.Columns) { ??? //ie 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列后更改其类型,但没有什么可以阻止您在运行时根据需要创建列。

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

创建复选框列的示例如下:

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

如果没有关于什么决定你的列类型的更多信息,很难给出更多的建议,但你可以轻松地将这种技术与DataTable一起使用,检查每个列的类型,甚至使用对绑定datagridview的对象的reflection至。

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

例如:

 var columns = new List>(); columns.Add(new Tuple("Name", "System.String")); columns.Add(new Tuple("Selected", "System.Boolean")); columns.Add(new Tuple("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; 

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

  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().Where(x => x.Name == "ColumnWantToChange").FirstOrDefault(); dgv.Columns.Remove(r); // Remove the original column