无法填充DataGridView

时间:2011-06-29 13:56:26

标签: c# winforms datagridview

我从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;
            }

4 个答案:

答案 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;
            }
        }
}
}

为我做这份工作。