获取DataBoundItem时.Net Winform dataRowView错误

时间:2017-11-03 17:52:22

标签: c# winforms data-binding datagridview

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

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

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

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

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

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

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

如果您的DataGridView有AllowUserToAddRows,那么“新行”会添加到DGV的末尾,但它还不包含任何数据。

要将其过滤掉,只需在foreach上添加一个条件,如下所示:

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

希望这有帮助。

答案 1 :(得分:0)

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

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

当触发事件时,MyDataGridView.Rows似乎认为行数等于我在datagrid中选择的行 - 但仅当所选行数大于筛选列表中的行数时。

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

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

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

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

我现在在循环期间计算行并且如果超出绑定行计数则退出'for',并且它可以工作。