设置 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.

IdentFirst name 以下的所有行都是 emptycustomerIDcustomerFirstName 以下的所有其他行都是 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;

【讨论】:

你填满你的数据集了吗?数据适配器 = 新的 SqlDataAdapter(); DataAdapter = CreateInventoryAdapter(); DataAdapter.TableMappings.Add("Table", "GARAGE"); DataAdapter.Fill(myDataSet); myDataView = myDataSet.Tables[0].DefaultView; dataGridView1.DataSource = myDataView【参考方案12】:

另外,如果您使用 AutoGenerateColumns=false,请确保您添加了一些绑定列,否则您将获得每条记录的空白行

【讨论】:

你有一个关于如何添加绑定列的简短示例吗?

以上是关于设置 DataGridView.DataSource 后获取空白行的主要内容,如果未能解决你的问题,请参考以下文章

QGIS基本设置和项目设置

短视频运营短视频剪辑 ⑤ ( 视频素材使用 | 设置插入后的视频素材属性 | 设置画面 | 设置音频 | 设置变速 | 设置动画 | 设置调节 )

SeeMusicMIDI 编辑功能 ( 速度设置 | SoundFont 音源设置 | 混响强度设置 | 混响时间设置 | 力度增益设置 | 实时 MIDI 设置 )

win10设置里的代理怎么设置

强制恢复出厂设置?

怎么设置标题样式?