DataTable每行两列求和显示于DataGridView遇格式错误问题求助
问题解决建议
核心问题分析
- 你当前代码里的
dt.AsEnumerable().Sum(...)是计算整个DataTable所有行的Maths和Physics总和,并非当前行的两列之和,完全不符合需求。 - 直接用
double.Parse转换字符串,若数据库中Maths或Physics字段存在空值、非数字内容,就会触发格式错误异常。 - 依赖
dataGridView1.CurrentRow填充数据不可靠,CurrentRow不一定指向你要操作的行,容易导致赋值混乱。
修正后的代码
SqlCommand cmd = new SqlCommand("SELECT * FROM Student", con); DataTable dt = new DataTable(); dt.Load(cmd.ExecuteReader()); // 清空现有行(可选,避免重复数据) dataGridView1.Rows.Clear(); foreach(DataRow row in dt.Rows) { // 安全解析数值,空值/非数字会返回默认值0 double maths = 0; double.TryParse(row["Maths"]?.ToString(), out maths); double physics = 0; double.TryParse(row["Physics"]?.ToString(), out physics); // 计算当前行的两列之和 double total = maths + physics; // 直接添加行并赋值,避免CurrentRow的不确定性 dataGridView1.Rows.Add( row["FullName"].ToString(), maths.ToString(), physics.ToString(), total.ToString() ); }
关键优化说明
- 用
double.TryParse替代double.Parse:即使字段值为空或格式错误,也不会抛出异常,而是返回预设的默认值(可根据需求调整)。 - 只计算当前行的数值和:不再遍历整个表求和,精准针对循环中的当前行处理,符合业务需求。
- 直接通过
Rows.Add()添加行并赋值:规避CurrentRow带来的不可靠性,代码逻辑更清晰简洁。
额外建议
- 如果数据库中
Maths和Physics本身是数值类型(如int、decimal),可以直接用Convert.ToDouble(row["Maths"]),比转字符串再解析更高效,也能减少格式问题。 - 提前给DataGridView配置好列名和数据类型,能让显示更规范,减少后续适配问题。
内容的提问来源于stack exchange,提问作者user3309231
相关产品推荐
相关产品推荐

