【发布时间】: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