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

C# DataGridView decimal空值传入后显示为0问题求解

C# DataGridView decimal类型空值显示0问题修复

问题现象

开发C# WinForm应用时,手动向DataGridView(下文简称dgv)添加行数据,已为Valor(金额)列设置N2十进制格式,传入decimal类型的subtotal变量作为金额值,空值场景下该列始终显示0,未按预期显示空白。
程序运行效果
相关标识符释义:

  • Carrinho:购物车(超市场景购物车模块)
  • Gravar:保存
  • Produtos:商品
  • Hora:时间
  • Quantidade:数量
  • Valor:金额

复现代码

dgv_Carrinho.ColumnCount = 4;
dgv_Carrinho.Columns[0].Name = "Produto";
dgv_Carrinho.Columns[1].Name = "Valor";
dgv_Carrinho.Columns[2].Name = "Quantidade";
dgv_Carrinho.Columns[3].Name = "Hora";
dgv_Carrinho.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dgv_Carrinho.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dgv_Carrinho.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
// 设置金额列数值显示格式
dgv_Carrinho.Columns[1].DefaultCellStyle.Format = "N2";
// 把控件内容插入dgv新行
dgv_Carrinho.Rows.Add(txt_Produto.Text, subtotal, cmb_Quantidade.Text, txt_Hora.Text);

问题原因

decimal是值类型,默认值为0m,没有原生空值状态。当subtotal未被赋值有效金额时,变量本身的值就是0,传入dgv后会按照设置的N2格式渲染为0.00,和列格式配置无关。

解决方案

方案1:使用可空decimal类型,空值传入DBNull(推荐,可区分0值和空值)

将subtotal改为可空decimal类型,空值场景下向dgv传入DBNull.Value,单元格会自动显示空白。

  1. 修改变量声明
// 原声明:decimal subtotal;
decimal? subtotal = null; // 初始值设为空,仅在计算出有效金额时给subtotal赋值
  1. 新增行时做空值判断
// 替换原有Rows.Add调用
object cellValor = subtotal.HasValue ? subtotal.Value : DBNull.Value;
dgv_Carrinho.Rows.Add(txt_Produto.Text, cellValor, cmb_Quantidade.Text, txt_Hora.Text);
  1. 可选配置:指定空值显示文本
// 空值默认显示空白,如需自定义提示文本可修改NullValue属性
dgv_Carrinho.Columns[1].DefaultCellStyle.NullValue = "";

方案2:通过CellFormatting事件将0值渲染为空白(适合不想修改变量类型的场景)

如果业务逻辑中不需要区分"0金额"和"空金额",可以直接订阅dgv的CellFormatting事件,将金额列的0值显示为空白。

private void dgv_Carrinho_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    // 仅处理Valor列(列索引为1),跳过列头行
    if (e.ColumnIndex == 1 && e.RowIndex >= 0)
    {
        if (e.Value != null && decimal.TryParse(e.Value.ToString(), out decimal val) && val == 0m)
        {
            e.Value = string.Empty;
            e.FormattingApplied = true;
        }
    }
}

注意:该方案仅修改显示效果,单元格实际存储的值仍为0,如果后续计算、导出逻辑需要区分空值和0值,不要使用该方案。


内容的提问来源于stack exchange,提问作者codertocode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 13:01:20