DataGridView按月筛选后计算列平均值报错,请求技术协助
问题分析与修复方案
核心错误点
- 固定行索引取值错误:循环里始终取
Rows[1],应该用循环变量i遍历每一行 - 列索引取错:
Cells[0]是日期列(Dátum),无法转换为double,要取温度列(索引1) - 未处理空行/无效数据:DataGridView默认最后一行是空行,且可能存在单元格值为空或非数字的情况
- 除零风险:筛选后无数据时,
Rows.Count为0会触发除零异常
修复后的代码
public void Zoradanie(string mesiac) { // 清空原有数据,避免累计 Dt.Rows.Clear(); using (StreamReader sr = new StreamReader(ControlID.TextData)) { CultureInfo culture = new CultureInfo("sk-SK"); var i = 0; while (!sr.EndOfStream) { string[] rows = sr.ReadLine().Split(','); DataRow dr = Dt.NewRow(); var datum = rows[0].Replace("\"", string.Empty); if (i >= 2 && datum[0] == mesiac[0] && datum[1] == mesiac[1]) { dr["Dátum"] = datum; dr["Teplota FV panelu"] = rows[49]; Dt.Rows.Add(dr); } i++; } dataGridView1.DataSource = Dt; } double sum = 0; int validRowCount = 0; CultureInfo skCulture = new CultureInfo("sk-SK"); for (int i = 0; i < dataGridView1.Rows.Count; ++i) { // 跳过最后一行空行(如果允许添加新行) if (dataGridView1.Rows[i].IsNewRow) continue; // 获取温度列的值(索引1) var cellValue = dataGridView1.Rows[i].Cells[1].Value; if (cellValue != null && double.TryParse(cellValue.ToString(), NumberStyles.Any, skCulture, out double tempValue)) { sum += tempValue; validRowCount++; } } // 处理无有效数据的情况 if (validRowCount == 0) { label1.Text = "无有效数据计算平均值"; return; } double avg = sum / validRowCount; string avgString = avg.ToString("N2", skCulture); label1.Text = $"Priemerná teplota: {avgString}"; }
关键修复说明
- 清空原有数据:每次筛选前清空
Dt的行,避免旧数据干扰新结果 - 遍历正确行:用
Rows[i]代替固定Rows[1],遍历所有有效行 - 切换正确列:使用
Cells[1]获取温度列数据,而非日期列 - 跳过空行:通过
IsNewRow判断并跳过DataGridView的默认空行 - 安全转换数值:用
double.TryParse结合斯洛伐克文化(sk-SK)处理数值转换,避免格式错误 - 处理无数据场景:当没有有效数据时给出提示,避免除零异常
内容的提问来源于stack exchange,提问作者Pavol Trimay
相关产品推荐
相关产品推荐

