我从DataTable中填充DataGridView,但收到以下错误:
至少有一个DataGridView control的列没有单元格模板
private void PopulateGridView(DataTable dt)
{
if (dt != null)
{
dataGridView1.Columns.Clear();
dataGridView1.DataSource = null;
foreach (DataColumn col in dt.Columns)
{
//Declare the bound field and allocate memory for the bound field.
DataGridViewColumn datacolumn = new DataGridViewColumn();
//Initalize the DataField value.
datacolumn.DataPropertyName = col.ColumnName;
datacolumn.Name = col.ColumnName;
//Initialize the HeaderText field value.
datacolumn.HeaderText = col.ColumnName;
//Add the newly created bound field to the GridView.
this.dataGridView1.Columns.Add(datacolumn); // ** Error **
}
//Initialize the DataSource
this.dataGridView1.DataSource = dt;
}
答案 0 :(得分:4)
您看到的错误是因为您要添加未分配单元格模板的基本列类型DataGridViewColumn
。如果DataGridView尝试为此列分配一个新单元格,它将不知道该怎么做。
您可以选择定义列类型,也可以将列的单元格模板设置为单元格。
DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
datagridview1.Columns.Add(col);
或
DataGridViewColumn col= new DataGridViewColumn();
DataGridViewTextBoxCell cell = new DataGridViewTextBoxCell();
col.CellTemplate = cell;
datagridview1.Columns.Add(col);
有几种可用的列类型。
然而您可能想要做的是让列自动生成。将DataGridView属性AutoGenerate列设置为true
(默认值)时,将在分配数据源时创建列。
以编程方式添加列通常很有用(例如,添加一个复选框列以允许行选择)但在这种情况下,您不需要这样做。
答案 1 :(得分:3)
就像ASPMapper在原始问题下面的评论中所说,只需设置它即可。您甚至不必事先清除列:
private void PopulateGridView(DataTable dt)
{
dataGridView1.DataSource = dt;
// notice if your DataTable is null, it simply clears the DataGridView control
}
答案 2 :(得分:2)
您的代码崩溃,因为DataGridViewColumn
未提供单元格模板...
也许你想用其中一个? (而不是基础DataGridViewColumn
)
DataGridViewButtonColumn
DataGridViewCheckBoxColumn
DataGridViewComboBoxColumn
DataGridViewImageColumn
DataGridViewLinkColumn
DataGridViewTextBoxColumn
另一方面......当提供新的数据源时,DataGridView能够在运行时自动创建列...
答案 3 :(得分:1)
private void PopulateGridView(DataTable dt)
{
if (dt != null)
{
dataGridView1.Columns.Clear();
dataGridView1.DataSource = null;
dataGridView1.AutoGenerateColumns = true;
this.dataGridView1.DataSource = dt;
}
}
}
}
为我做这份工作。