C1TrueDBGrid列页脚报错‘输入字符串格式不正确’问题咨询
解决C1TrueDBGrid页脚计算时的“Input string was not in correct format”错误
我帮你排查下这个问题,这种格式转换报错大概率是单元格内容无法正常转为double类型导致的。结合你的代码和C1TrueDBGrid的特性,这里有几个可能的原因和对应的解决办法:
1. 新增行的空值/未初始化问题
你代码里开启了AllowAddNew = true,并且手动新增了一行。C1TrueDBGrid的新增行(处于AddNew状态)的单元格默认是空字符串或者DBNull.Value,直接用Convert.ToDouble转换空值就会抛出格式错误。而其他C1组件可能对新增行的处理更宽松(比如自动返回0或者忽略该行),所以没报错。
解决办法:循环时跳过新增行,或者先判断单元格值是否为空:
// 跳过新增行的判断逻辑 if (this.dg.Splits[0].Rows[a].RowState == C1.Win.C1TrueDBGrid.RowStateEnum.AddNew) continue;
2. 单元格内容包含非数字/格式不兼容
有些行的AMOUNT列可能存在空格、特殊符号,或者因系统文化差异导致小数点格式不匹配(比如用逗号代替点),Convert.ToDouble对这些情况容错性很差。
解决办法:用double.TryParse代替Convert.ToDouble,安全转换同时过滤无效值:
double cellValue; // 支持货币、浮点格式,兼容当前系统文化 if (double.TryParse(this.dg.Columns["AMOUNT"].CellValue(a)?.ToString(), System.Globalization.NumberStyles.Currency | System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.CurrentCulture, out cellValue)) { sum += cellValue; }
3. 列的DataType未设置为数值类型
如果AMOUNT列的DataType被设为string,单元格存储的是字符串而非数值,转换时更容易出问题。其他C1组件可能自动做了类型转换,但TrueDBGrid严格遵循列的DataType设置。
解决办法:确保列的DataType是数值类型:
// 可以在初始化时设置 dg.Columns["AMOUNT"].DataType = typeof(double);
优化后的完整页脚代码
把上面的逻辑整合起来,修改后的代码应该能避免报错:
double sum = 0; for (int a = 0; a <= this.dg.Splits[0].Rows.Count - 1; a++) { // 跳过新增行 if (this.dg.Splits[0].Rows[a].RowState == C1.Win.C1TrueDBGrid.RowStateEnum.AddNew) continue; object cellVal = this.dg.Columns["AMOUNT"].CellValue(a); // 处理DBNull或空值 if (cellVal == null || cellVal == DBNull.Value) continue; double cellValue; // 安全转换 if (double.TryParse(cellVal.ToString(), System.Globalization.NumberStyles.Currency | System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.CurrentCulture, out cellValue)) { sum += cellValue; } } this.dg.Columns["AMOUNT"].FooterText = sum.ToString("n");
简单总结下:其他C1组件对空值、新增行的处理更灵活,而TrueDBGrid需要你显式处理这些边界情况,通过跳过新增行、安全转换、设置正确的列类型就能解决这个问题。
内容的提问来源于stack exchange,提问作者Alphatrix
相关产品推荐
相关产品推荐

