You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:56:33