设置DataGridView.DataSource后获取空行

时间:2009-11-17 14:30:30

标签: c# winforms datagridview datasource

有人可以告诉我为什么在运行此代码后我得到空行?

...
dataGridView.AutoGenerateColumns = false; //must be false, else getting additional columns from SQL
dataGridView.DataSource = dataSet.Tables[0].DefaultView; 

也试过

dataGridView.Update();

但没有工作。

行数没问题,但为什么我会得到空行?

我正在使用Winforms。

12 个答案:

答案 0 :(得分:16)

我发现了问题。

我在VS datagridview设计器中设计了列。不是列名,但列DataPropertyName必须与数据库中的字段匹配。

然后重复的列也会隐藏。

答案 1 :(得分:9)

尝试以下几点:

grid.AutoGenerateColumns = false;

DataGridViewColumn col = new DataGridViewTextBoxColumn();
col.DataPropertyName = "Prop1";
col.HeaderText = "Property 1";
grid.Columns.Add(col);

col = new DataGridViewTextBoxColumn();
col.DataPropertyName = "Prop2";
col.HeaderText = "Property 2";
grid.Columns.Add(col);

grid.DataSource = dataSet.Tables[0].DefaultView;

Prop1& Prop2应该与您的表的列名匹配。物业1&属性2是要显示的标题文本。

编辑:

从您给出的示例看起来,您正在将绑定列与未绑定列组合在一起。

这样做:

1.删除使用设计器添加的任何列 2.添加此代码:

grid.AutoGenerateColumns = false;

DataGridViewColumn colID = new DataGridViewTextBoxColumn();
colID.DataPropertyName = "customerID";
colID.HeaderText = "Ident.";
grid.Columns.Add(colID);

DataGridViewColumn colName = new DataGridViewTextBoxColumn();
colName.DataPropertyName = "customerFirstName";
colName.HeaderText = "First name";
grid.Columns.Add(colName);    
grid.DataSource = dataSet.Tables[0].DefaultView;

HTH。

答案 2 :(得分:4)

此外,如果您使用AutoGenerateColumns = false,请确保添加了一些绑定列,否则每个记录都会显示一个空行

答案 3 :(得分:4)

我知道你发布这篇文章已经有很长一段时间了,但我遇到了同样的问题并找到了答案,所以我想我会发布它以便别人可以受益。

列是空白的原因是因为您还需要设置设计器中每个列的DataPropertyName以匹配您的数据库字段名称。仅设置设计名称是不够的。

希望能有所帮助。

答案 4 :(得分:3)

您的DataSet中包含哪些内容?

可能DataSet中包含的DataTable没有任何行。我会将AutoGenerateColumns保留为true,只需手动隐藏您不希望看到的列。我从未使用过AutoGenerateColumns = false。但是,如果没有更多代码,就很难诊断出来。尝试交换这两个语句(.DataSource优先)。

AutoGenerateColumns可能对相应的绑定源(DataSet中的DataTable)没有影响。

DataSet需要填充DataSet:

// Example
DataAdapter = new SqlDataAdapter();
DataAdapter = CreateInventoryAdapter();
DataAdapter.TableMappings.Add("Table", "GARAGE");

DataAdapter.Fill(myDataSet);
myDataView = myDataSet.Tables[0].DefaultView;
dataGridView1.DataSource = myDataView

答案 5 :(得分:1)

好的更广泛的样本:

我在设计师中写了一些专栏:

列名:customerID and customerFirstName

列标题文字:Ident. and First name

然后我从sql表中获取一些数据......

sql = "select customerID, customerFirstName From customer;";

dataGridView.AutoGenerateColumns = false;
dataGridView.DataSource = dataSet.Tables[0].DefaultView;

和sql表列与dataGridView中的列名相同。

dataGridView.AutoGenerateColumns = false;是带有headerText Ident. | First name的双列dataGridView时得到的结果。

当我设置dataGridView.AutoGenerateColumns = true;时,我得到如下的dataGridView列: Ident. | First name | customerID | customerFirstName

IdentFirst name下面的所有行都是empty,而customerIDcustomerFirstName下面的所有其他行都是ok

现在我希望customerIDcustomerFirstName下方的行位于IdentFirst name下,而customerIDcustomerFirstName列应位于隐。

我写了这段代码并且有效:

 DataTable dTable = dataGridView.GetTable().Tables[0];

 foreach (DataRow dataRow in dataGridView.GetTable().Tables[0].Rows)
 {
    int n = dataGridView.Rows.Add();
    foreach (DataColumn dataColumn in dTable.Columns)
    {
       dataGridView.Rows[n].Cells[dataColumn.ColumnName].Value = dataRow[dataColumn.ColumnName].ToString();
    }
 }

但是为什么DataGridView不会用这段代码为我做这件事:

dataGridView.DataSource = dataSet.Tables[0].DefaultView;

答案 6 :(得分:1)

Me.dgvList.AutoGenerateColumns = False

    Dim col = New DataGridViewTextBoxColumn()
    col.DataPropertyName = "VisitNo"
    col.HeaderText = "Sr. No."
    dgvList.Columns.Add(col)

它有效

答案 7 :(得分:1)

万一仍有问题,我的问题是我试图绑定到类public Fields而不是属性。更改为属性,即{得到; set;}对其进行了修复。

答案 8 :(得分:0)

尝试在加载Grid之前添加此代码

dataGridView.ColumnCount = 0;

答案 9 :(得分:0)

所以我有一个自定义实现,我让用户能够保存列的类似excel的过滤器。

我将结果加载到网格中,但由于列上类似excel的过滤器无法匹配任何内容,因此没有任何内容出现。

答案 10 :(得分:0)

我知道它已经晚了但是我的案例解决方案并没有自定义datagridview列。只需添加一个空白的datagridview&绑定它。

答案 11 :(得分:0)

在我的情况下,没有行可见,因为我是由LINQ生成数据的,并且忘记了在末尾添加对.ToArray()的调用。将数据行转换为数组后,它可以工作。