【问题标题】:.Net Winform dataRowView error when getting DataBoundItem.Net Winform dataRowView 获取 DataBoundItem 时出错
【发布时间】:2017-11-03 17:52:22
【问题描述】:

有时,我的 WinForm 上的 datagridview 中没有条目。

但我总是按如下方式验证行:

foreach (DataGridViewRow rwX in MyDataGridView.Rows) {
    DataRowView drv = (DataRowView) rwX.DataBoundItem;
     //validation here
}

代码认为有行,所以它会进入 foreach 语句,但是当数据网格没有显示任何项目时,它尝试从第一行获取 DataBoundItem 时崩溃。

我尝试使用以下 if/then 绕过运行上述验证代码的方法,但都通过并因此运行验证。

if (this.bindingSource.Item(0) != null) {
    // run validate method
}

if (this.bindingSource.Count > 0) {
    // run validate method
}

if (this.myDataGridView.Rows(0) != null) {
    // run validate method
}

if (this.myDataGridView.Rows.Count > 0) {
    // run validate method
}

我不确定为什么验证认为有行然后在尝试从第一行获取 DataBountItem 时崩溃,但我希望找到一种方法来捕获此问题而无需 Try Catch

感谢您的帮助

【问题讨论】:

  • 你有this.dataGridView1.AllowUserToAddRows = false;吗?如果它设置为true,那么您可能会遇到没有要显示的项目的情况 - 保存NewRow,它没有DataBoundItem。虽然 - 这不能解释为什么你的前两个 if 语句仍然会通过。
  • 显然,崩溃是尝试使用空值的结果。我相信如果数据绑定项不存在但它不会崩溃,那么…DataRowView drv = (DataRowView) rwX.DataBoundItem; 行将简单地返回一个空值。它只是返回一个空值并且不抛出异常。如果您尝试使用drv...,那么它显然会崩溃。在您尝试验证数据之前,似乎有必要(像往常一样)对这个可能的空值进行简单检查。
  • 另外,我质疑你的说法……“代码认为有行,所以会进入foreach语句”……如果进入foreach循环……至少有一 (1) 行。我不确定代码会如何“相信”否则。如果进入循环,就有一行。
  • 好吧,我想通了。约翰,问题实际上是由于过滤列表而发生的崩溃。如果当前选择的行是第 100 行,但过滤后的列表少于 100 行,则 MyDataGridView.Rows 不会赶上(它认为我有 100 行,因为这是我在应用过滤器之前选择的行)。 rwX.DataBoundItem 已经使用过滤列表进行了更新。差异导致了炸弹。上面的代码是被一个事件调用的,所以显然有一个排序问题。如果超出绑定行数,我现在将退出“for”。

标签: c# winforms data-binding datagridview


【解决方案1】:

如果您的 DataGridView 有 AllowUserToAddRows,则在 DGV 的末尾添加一个“新行”,但它还不包含任何数据。

要过滤掉它,只需在你的 foreach 中添加一个条件,如下所示:

foreach (DataGridViewRow rwX in dataObjectListDataGridView.Rows)
{
    if(!rwX.IsNewRow)
    {
        DataRowView drv = (DataRowView)rwX.DataBoundItem;
    //validation here
    }
}

希望这会有所帮助。

【讨论】:

  • 关闭,但请参阅我上面的评论。
【解决方案2】:

好的,我想通了。问题是由于 rwX.DataBoundItem 是一个空行,显然,但空行的原因有点模糊。

原来是由于过滤了列表,然后过滤触发了一个事件,该事件调用了我在上面的问题中显示的验证代码。

当事件被触发时,MyDataGridView.Rows 似乎认为行数等于我在数据网格中选择的行——但前提是选择的行数大于过滤列表中的行数.

例如,如果我选择了第 100 行,但过滤后的列表只有 99 行,则 foreach 将循环遍历 100 行,并且一旦循环到第 100 行,rwX.DataBoundItem 就会爆炸。它会爆炸,因为绑定的行已被更新以匹配过滤列表,该列表仅包含 99 行,因此 rwX.DataBoundItem 将在第 100 行返回空值。

另一方面,如果我在过滤之前选择了第 1 行,并且过滤后的列表有 99 行,那么“foreach”语句将正确运行 99 行。

这似乎是微软数据网格的错误行为。

请注意,事件调用的验证代码完成后,会自动清理差异,以便 MyDataGridView.Rows 匹配数据绑定项。

我现在在循环期间对行进行计数,如果超出了绑定行数,则让它退出“for”,并且它可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    相关资源
    最近更新 更多