有时,我的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
感谢您的帮助
答案 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',并且它可以工作。