如何在交互式网格中实现基于均值与标准差的上下限批量/逐行计算?
交互式网格上下限计算实现方案
需求说明
- 计算规则:
- 下限(low):
(均值 - 标准差) * 2 - 上限(high):
(均值 + 标准差) * 2
- 下限(low):
- 触发方式:
- 点击「计算上下限」按钮,批量遍历网格所有行完成计算
- 每行输入均值和标准差后,自动计算该行的上下限
一、按钮触发批量计算实现(修复原代码公式问题)
原C#代码存在公式错误(原代码直接用均值 - 标准差*2,不符合需求的(均值-标准差)*2),以下是修正后的实现:
private void btnsdi_Click(object sender, EventArgs e) { for (int i = 0; i < dgvResult.Rows.Count; i++) { // 跳过空行或均值/标准差为空的行 if (dgvResult.Rows[i].Cells[4].Value == null || dgvResult.Rows[i].Cells[5].Value == null) continue; if (decimal.TryParse(dgvResult.Rows[i].Cells[4].Value.ToString(), out decimal mean) && decimal.TryParse(dgvResult.Rows[i].Cells[5].Value.ToString(), out decimal sd)) { // 按正确公式计算上下限 dgvResult.Rows[i].Cells[6].Value = (mean - sd) * 2; dgvResult.Rows[i].Cells[7].Value = (mean + sd) * 2; } } }
代码优化点说明
- 替换
String.IsNullOrEmpty为null判断+decimal.TryParse,避免格式转换异常 - 修正计算逻辑,严格匹配需求公式
- 跳过无效行(空值、格式错误),提升稳定性
二、单行输入自动计算实现
通过网格的单元格值变化事件(如CellValueChanged),监听均值或标准差单元格的输入,实时计算当前行的上下限:
private void dgvResult_CellValueChanged(object sender, DataGridViewCellEventArgs e) { // 仅监听均值(索引4)或标准差(索引5)列的变化 if (e.ColumnIndex != 4 && e.ColumnIndex != 5) return; int rowIndex = e.RowIndex; // 跳过表头行 if (rowIndex < 0 || rowIndex >= dgvResult.Rows.Count) return; var row = dgvResult.Rows[rowIndex]; // 检查均值和标准差单元格是否有有效值 if (row.Cells[4].Value == null || row.Cells[5].Value == null) return; if (decimal.TryParse(row.Cells[4].Value.ToString(), out decimal mean) && decimal.TryParse(row.Cells[5].Value.ToString(), out decimal sd)) { // 实时计算并赋值上下限 row.Cells[6].Value = (mean - sd) * 2; row.Cells[7].Value = (mean + sd) * 2; } else { // 若输入格式错误,清空上下限 row.Cells[6].Value = null; row.Cells[7].Value = null; } }
注意事项
- 确保网格的
CellValueChanged事件已绑定到上述方法 - 若使用编辑控件(如TextBox)嵌入单元格,可能需要监听编辑控件的
TextChanged事件来触发计算 - 可根据实际网格控件的类型(如DevExpress、Telerik等)调整事件名称和单元格访问方式
内容的提问来源于stack exchange,提问作者Ziad Adnan
相关产品推荐
相关产品推荐

