获取DataBoundItem时发生Net Winform dataRowView错误



有时,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 的情况下捕获这种情况的方法

感谢的帮助

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

要过滤掉它,只需在前臂上添加一个条件,如下所示:

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

希望这能有所帮助。

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

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

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

例如,如果我选择了第100行,但过滤后的列表只有99行,foreach将循环通过100行和rwX。DataBoundItem一旦进入第100行就会爆炸。它会爆炸,因为绑定行已经更新以匹配过滤列表,该列表只包含99行,因此为rwX。DataBoundItem将在第100行返回一个空值。

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

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

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

现在,我在循环过程中对行进行计数,如果超过绑定行数,我会让它退出"for",并且它可以工作。

最新更新