C# WinForm中GridView带CheckBox的校验(至少勾选一项)实现
C# WinForm DataGridView 至少勾选一项的校验实现
你的代码问题说明
当前代码存在几个核心问题:
- 循环中始终只检查第0行的CheckBox,未遍历所有行
if语句存在语法错误,缺少条件判断逻辑- 校验逻辑颠倒,应该是未找到任何勾选项时才弹出提示
正确实现示例
方式1:常规循环遍历
private void btnSave_Click(object sender, EventArgs e) { bool hasCheckedItem = false; // 遍历所有行,跳过新增空白行 foreach (DataGridViewRow row in dgvPurchaseOrder.Rows) { if (row.IsNewRow) continue; // 安全获取CheckBox列值,避免空值转换异常 object checkValue = row.Cells["checkBoxColumn"].Value; if (checkValue != null && !DBNull.Value.Equals(checkValue)) { if (Convert.ToBoolean(checkValue)) { hasCheckedItem = true; break; // 找到勾选项后立即终止遍历,提升效率 } } } if (!hasCheckedItem) { MessageBox.Show("至少勾选一条记录再保存"); return; } // 此处编写你的保存逻辑 // ... }
方式2:LINQ简化写法
如果习惯用LINQ,可以用更简洁的代码实现相同逻辑:
private void btnSave_Click(object sender, EventArgs e) { bool hasCheckedItem = dgvPurchaseOrder.Rows.Cast<DataGridViewRow>() .Where(row => !row.IsNewRow) .Any(row => { object checkValue = row.Cells["checkBoxColumn"].Value; return checkValue != null && !DBNull.Value.Equals(checkValue) && Convert.ToBoolean(checkValue); }); if (!hasCheckedItem) { MessageBox.Show("至少勾选一条记录再保存"); return; } // 执行保存逻辑 // ... }
关键注意事项
- 跳过
IsNewRow:若DataGridView允许新增行,最后一行是空白新增行,无需纳入检查 - 空值判断:单元格值可能为
null或DBNull,直接转换会抛出异常,必须先做判断 - 提前终止遍历:找到第一个勾选项后立即停止遍历,避免不必要的性能消耗
内容的提问来源于stack exchange,提问作者hasan ishu
相关产品推荐
相关产品推荐

