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,单元格会自动显示空白。
- 修改变量声明
// 原声明:decimal subtotal; decimal? subtotal = null; // 初始值设为空,仅在计算出有效金额时给subtotal赋值
- 新增行时做空值判断
// 替换原有Rows.Add调用 object cellValor = subtotal.HasValue ? subtotal.Value : DBNull.Value; dgv_Carrinho.Rows.Add(txt_Produto.Text, cellValor, cmb_Quantidade.Text, txt_Hora.Text);
- 可选配置:指定空值显示文本
// 空值默认显示空白,如需自定义提示文本可修改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
相关产品推荐
相关产品推荐

