【问题标题】:Why am I Getting Null DataTable?为什么我得到空数据表?
【发布时间】:2016-07-03 21:05:28
【问题描述】:

我创建了一个非常简单的测试来将此问题归结为常见元素。我有一个 MS Access 数据库,其中有 1 个且只有 1 个表。 2 列(ID、名称)并向表中添加了 4 行数据。以下是重现问题的步骤:

  • 我在项目的数据源中添加了一个包含DataTableDataSet。 (从数据库中添加新的数据源)
  • 我添加了一个测试Form1,其中有 1 个且只有 1 个控件,DataGridView
  • 我使用设计器将该网格绑定到项目数据源中的表。 (在设计时使用DataGridViewDataSource 属性)。

我的Form_Load 看起来像这样:

private void Form1_Load(object sender, EventArgs e)
{
    // TODO: This line of code loads data into the 'testDBDataSet.TestTable' table. You can move, or remove it, as needed.
    this.testTableTableAdapter.Fill(this.testDBDataSet.TestTable);

    BindingSource bs = (BindingSource)dgvTestData.DataSource;
    DataTable dt = (dgvTestData.DataSource) as DataTable;            
}

当我越过最后一行代码时,dt 为空。我错过了什么?

我知道这很简单而且可能很明显,但我没有看到。如果我只是将代码运行回表单,DataGridView 中有数据。

我做错了什么?如何使用上述步骤从BindingSource 中获取基础DataTable,该DataSource 设置为我的DataGridViewDataSource

【问题讨论】:

  • 您确实需要提供minimal reproducible example。现在唯一可以说的是dgvTestData.DataSource不是非nullDataTable。您的问题中没有任何内容显示您实际上是如何分配 DataSource 的,所以我们真的不能说您需要确保正确分配它的任何其他内容。
  • @Enigmativity 我编辑了这篇文章,让未来的读者更清楚地了解问题所在以及使用了哪些设置。 OP 通过设置DataGridDataSource 属性,使用设计器将DataGridView 绑定到DataSetDataTable。代码是自动生成的,OP 没有其他东西可以与我们分享。对于在使用数据绑定和设计器工具方面经验丰富的开发人员来说,这个案例是熟悉的,但无论如何,我也试图让其他读者更清楚地了解这个案例。希望你觉得它有用:)
  • @RezaAghaei - 这根本没用。 OP 至少应该发布设置DataSource 的设计器代码。真的应该提供minimal reproducible example。如果他们这样做了,那么问题很可能会自行解决。现在这是一个有点懒惰的问题。 OP 应该尽一切努力使问题易于回答。
  • @Enigmativity 对于有经验的用户来说,IMO 就足够了 :)
  • @RezaAghaei 是的,这可能是真的,但是 SO 作为存储库存在,供没有经验的用户查找高质量问题和答案的库。经验丰富的用户,几乎按照定义,已经知道答案。

标签: c# winforms datagridview


【解决方案1】:

我做错了什么?

dgvTestData.DataSourceBindingSource 时,您不能指望dgvTestData.DataSource as DataTable 返回null 以外的任何内容。

as 运算符类似于强制转换操作。但是,如果无法进行转换,则 as 返回 null 而不是引发异常。

如何从 BindingSource 获取底层 DataTable?

您似乎将网格绑定到绑定源,其DataSource 设置为DataSet,其DataMemberDataTable 的名称。当您使用设计器将网格的数据源设置为表格或从数据源窗口拖放Table 并拖放到表单上时,这是默认行为。因此,如果您遵循默认方案,则可以使用此类代码获取DataTable

BindingSource bs = (BindingSource)dgvTestData.DataSource;
var dt = (bs.DataSource as DataSet).Tables[bs.DataMember]; 

如果您使用与默认方案不同的任何其他方案,您可以简单地使用绑定源的DataSourceDataMember 属性来提取用于数据绑定的DataTable

有没有更好的方法?

这取决于,为什么不简单地使用:

var dt = this.testDBDataSet.TestTable;

【讨论】:

  • 非常感谢 Reza!这就是我需要的确切信息。归根结底,我正在通过 gridview 对表中的数据进行编辑。我没有意识到我在网格中所做的更改实际上正在更改为实际的底层数据集。我认为在 gridview 中发生的事情和实际的底层(在内存中)数据之间存在一个分区。现在我明白了,我的工作变得轻松了很多!非常感谢!!!
猜你喜欢
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 2017-04-06
  • 2021-12-23
  • 2021-07-03
  • 2016-11-22
相关资源
最近更新 更多