设置 DataGridView.DataSource 后获取空白行
Posted
技术标签:
【中文标题】设置 DataGridView.DataSource 后获取空白行【英文标题】:Getting blank rows after setting DataGridView.DataSource 【发布时间】:2010-12-17 11:35:26 【问题描述】:有人能告诉我为什么我在运行这段代码后会出现空白行吗?
...
dataGridView.AutoGenerateColumns = false; //must be false, else getting additional columns from SQL
dataGridView.DataSource = dataSet.Tables[0].DefaultView;
也试过了
dataGridView.Update();
但不工作。
行数没问题,但为什么我得到空白行?
我正在使用 Winforms。
【问题讨论】:
【参考方案1】:在我的情况下,没有行可见,因为我通过 LINQ 生成数据并忘记在最后添加对 .ToArray()
的调用。将数据行转换为数组后,就可以了。
【讨论】:
【参考方案2】:如果有人仍然遇到问题,我的问题是我试图绑定到类公共字段而不是属性。更改为属性,即得到; set; 修复它。
【讨论】:
【参考方案3】:我知道已经很晚了,但我的案例解决方案不是自定义 datagridview 的列。只需添加一个空白的 datagridview 并绑定它。
【讨论】:
【参考方案4】:所以我有一个自定义实现,让用户能够保存列的类似 excel 的过滤器。
我将结果加载到网格中,但由于列上类似 excel 的过滤器无法匹配任何内容,因此什么也没有出现。
【讨论】:
【参考方案5】:尝试在加载网格之前添加此代码
dataGridView.ColumnCount = 0;
【讨论】:
【参考方案6】:我发现了问题。
我在 VS datagridview 设计器中设计了列。不是列名,而是列 DataPropertyName 必须与数据库中的字段匹配。
然后重复的列也会隐藏。
【讨论】:
【参考方案7】:Me.dgvList.AutoGenerateColumns = False
Dim col = New DataGridViewTextBoxColumn()
col.DataPropertyName = "VisitNo"
col.HeaderText = "Sr. No."
dgvList.Columns.Add(col)
有效
【讨论】:
【参考方案8】:我知道您发布此内容已经很长时间了,但我遇到了同样的问题并想出了答案,所以我想我会发布它以便其他人受益。
您的列为空的原因是您还需要在设计器中设置每个列的 DataPropertyName 以匹配您的数据库字段名称。仅设置设计名称是不够的。
希望对某人有所帮助。
【讨论】:
【参考方案9】:您的数据集中包含什么?
可能您的 DataSet 中包含的 DataTable 没有任何行。我会将 AutoGenerateColumns 保留为 true,然后手动隐藏您不想看到的列。我从未使用过 AutoGenerateColumns = false。但是,如果没有更多代码,将很难诊断。尝试交换这两个语句(首先是 .DataSource)。
AutoGenerateColumns 可能对相应的绑定源(DataSet 中的DataTable)没有影响。
DataSet需要由DataAdapter填充:
// Example
DataAdapter = new SqlDataAdapter();
DataAdapter = CreateInventoryAdapter();
DataAdapter.TableMappings.Add("Table", "GARAGE");
DataAdapter.Fill(myDataSet);
myDataView = myDataSet.Tables[0].DefaultView;
dataGridView1.DataSource = myDataView
【讨论】:
各位感谢您的帮助,但我不想再花时间在这上面了。我的扩展代码也可以正常工作,所以不想再更改它。最好的问候【参考方案10】:尝试以下方法:
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。
【讨论】:
我的代码和你的一样。只是我在设计器中设置了 datagridview 列,并且它们与我的表列名匹配。 然后,如果您使用设计器绑定网格并且从 sql 获取其他列是您唯一关心的问题,您可以简单地使用设计器使不需要的列不可见。 我可以使它们不可见,但附加的列标题文本与使用设计器制作的其他列不同。 p.s.:这是一个多语言应用程序。 我不确定我是否正确...据我了解,您有一组列,其中一些是不可见的,而另一些是可见的。对于不可见的列,标题文本并不重要。对于可见列,您可以根据当前语言以编程方式设置显示的标题文本。没有看到问题出在哪里,但我可能会遗漏一些东西。也许更扩展的代码示例会有所帮助。 Sorin 上面你可以看到我的问题的扩展描述。【参考方案11】:好的,更扩展的示例:
我在设计师中做了一些专栏:
列名: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
.
Ident
和 First name
以下的所有行都是 empty
,customerID
和 customerFirstName
以下的所有其他行都是 ok
。
现在我希望 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;
【讨论】:
你填满你的数据集了吗?数据适配器 = 新的 SqlDataAdapter(); DataAdapter = CreateInventoryAdapter(); DataAdapter.TableMappings.Add("Table", "GARAGE"); DataAdapter.Fill(myDataSet); myDataView = myDataSet.Tables[0].DefaultView; dataGridView1.DataSource = myDataView【参考方案12】:另外,如果您使用 AutoGenerateColumns=false,请确保您添加了一些绑定列,否则您将获得每条记录的空白行
【讨论】:
你有一个关于如何添加绑定列的简短示例吗?以上是关于设置 DataGridView.DataSource 后获取空白行的主要内容,如果未能解决你的问题,请参考以下文章
短视频运营短视频剪辑 ⑤ ( 视频素材使用 | 设置插入后的视频素材属性 | 设置画面 | 设置音频 | 设置变速 | 设置动画 | 设置调节 )
SeeMusicMIDI 编辑功能 ( 速度设置 | SoundFont 音源设置 | 混响强度设置 | 混响时间设置 | 力度增益设置 | 实时 MIDI 设置 )