设置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
。
Ident
和First name
下面的所有行都是empty
而customerID
和customerFirstName
下面的所有其他行都可以。
现在我希望customerID
和customerFirstName
下面的行在Ident
和First name
,并且应该隐藏customerID
和customerFirstName
列。
我写了这段代码,它有效:
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()
的调用。 将数据行转换为数组后,它就可以工作了。