设置DataGridView.DataSource后获取空行

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

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

也试过了

 dataGridView.Update(); 

但没有工作。

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

我正在使用Winforms。

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 

我发现了问题。

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

然后还会隐藏重复的列。

尝试这些方面的东西:

 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。

此外,如果您使用AutoGenerateColumns = false,请确保添加了一些绑定列,否则您将为每条记录获取一个空行

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

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

希望能帮助别人。

好的更广泛的样本:

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

列名: customerID and customerFirstName

column headerText: Ident. and First name 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;时得到的结果dataGridView.AutoGenerateColumns = false; 是一个带有headerText Ident. | First name的两列dataGridView Ident. | First name Ident. | First name Ident. | First name

当我设置dataGridView.AutoGenerateColumns = true; 然后我得到像这样的dataGridView列: Ident. | First name | customerID | customerFirstName Ident. | First name | customerID | customerFirstName Ident. | First name | customerID | customerFirstName

IdentFirst name下面的所有行都是emptycustomerIDcustomerFirstName下面的所有其他行都可以。

现在我希望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;

Me.dgvList.AutoGenerateColumns = False

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

有用

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

 dataGridView.ColumnCount = 0; 

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

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

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

如果有人仍然有问题,我的问题是我试图绑定到类公共字段而不是属性。 改变属性即{get; 设置;}修复它。

在我的例子中没有可见的行,因为我通过LINQ生成数据并忘记在最后添加对.ToArray()的调用。 将数据行转换为数组后,它就可以工作了。