Datagridview单元格双向动态计算实现(C#代码请求)
DataGridView 不含VAT/含VAT价格双向联动实现
我在DataGridView中设置了两列——不含VAT的价格列(PrecoFilhoSemIva)和含VAT的价格列(PrecoFilhoComIva),需要实现双向动态联动:修改不含VAT的价格时自动更新含VAT价格,修改含VAT价格时自动更新不含VAT价格。目前仅实现了单向计算,求完整的双向逻辑代码。现有单向代码如下:
private void dgv_Filho_CellEndEdit_1(object sender, DataGridViewCellEventArgs e) { bool Check = Convert.ToBoolean(dgv_Filho.CurrentRow.Cells["Check_Filho"].Value); string Medida_1 = Convert.ToString(dgv_Filho.CurrentRow.Cells["Medida_1"].Value); string Medida_2 = Convert.ToString(dgv_Filho.CurrentRow.Cells["Medida_2"].Value); var Iva = Convert.ToDecimal(cb_Iva.Text); if (Check) { if (!string.IsNullOrWhiteSpace(tb_CodigoArtigo.Text) || !string.IsNullOrWhiteSpace(tb_Descricao.Text)) { dgv_Filho.CurrentRow.Cells["ArtigoPai"].Value = tb_CodigoArtigo.Text; dgv_Filho.CurrentRow.Cells["Descricao_Pai"].Value = tb_Descricao.Text + " " + Medida_1 + Medida_2; dgv_Filho.CurrentRow.Cells["CodigoArtigoFilho"].Value = tb_CodigoArtigo.Text + Medida_1 + Medida_2; //dgv_Filho.CurrentRow.Cells["PrecoFilhoSemIva"].Value = tb_PVP1.Text; decimal PrecoFilho = Convert.ToDecimal(dgv_Filho.CurrentRow.Cells["PrecoFilhoSemIva"].Value); if (PrecoFilho > 0) { decimal PrecoFilhoComIva = PrecoFilho * Iva / 100 + PrecoFilho; dgv_Filho.CurrentRow.Cells["PrecoFilhoComIva"].Value = PrecoFilhoComIva; } } else { dgv_Filho.CurrentRow.Cells["ArtigoPai"].Value = string.Empty; dgv_Filho.CurrentRow.Cells["Descricao_Pai"].Value = string.Empty; } } }
完整双向联动代码
private void dgv_Filho_CellEndEdit_1(object sender, DataGridViewCellEventArgs e) { // 跳过无效行或列 if (e.RowIndex < 0 || dgv_Filho.CurrentRow == null) return; bool Check = Convert.ToBoolean(dgv_Filho.CurrentRow.Cells["Check_Filho"].Value); string Medida_1 = Convert.ToString(dgv_Filho.CurrentRow.Cells["Medida_1"].Value); string Medida_2 = Convert.ToString(dgv_Filho.CurrentRow.Cells["Medida_2"].Value); // 安全转换税率,避免格式错误 if (!decimal.TryParse(cb_Iva.Text, out decimal Iva)) { MessageBox.Show("税率格式无效,请输入数字"); return; } // 防止除零错误 if (Iva == -100) { MessageBox.Show("税率不能为-100%,会导致除零错误"); return; } if (Check) { if (!string.IsNullOrWhiteSpace(tb_CodigoArtigo.Text) || !string.IsNullOrWhiteSpace(tb_Descricao.Text)) { dgv_Filho.CurrentRow.Cells["ArtigoPai"].Value = tb_CodigoArtigo.Text; dgv_Filho.CurrentRow.Cells["Descricao_Pai"].Value = tb_Descricao.Text + " " + Medida_1 + Medida_2; dgv_Filho.CurrentRow.Cells["CodigoArtigoFilho"].Value = tb_CodigoArtigo.Text + Medida_1 + Medida_2; } else { dgv_Filho.CurrentRow.Cells["ArtigoPai"].Value = string.Empty; dgv_Filho.CurrentRow.Cells["Descricao_Pai"].Value = string.Empty; } // 判断当前编辑的是哪一列,执行对应计算 DataGridViewColumn editedColumn = dgv_Filho.Columns[e.ColumnIndex]; if (editedColumn.Name == "PrecoFilhoSemIva") { // 从不含VAT计算含VAT if (decimal.TryParse(dgv_Filho.CurrentRow.Cells["PrecoFilhoSemIva"].Value?.ToString(), out decimal precoSemIva) && precoSemIva > 0) { decimal precoComIva = precoSemIva * (1 + Iva / 100); dgv_Filho.CurrentRow.Cells["PrecoFilhoComIva"].Value = precoComIva; } } else if (editedColumn.Name == "PrecoFilhoComIva") { // 从含VAT计算不含VAT if (decimal.TryParse(dgv_Filho.CurrentRow.Cells["PrecoFilhoComIva"].Value?.ToString(), out decimal precoComIva) && precoComIva > 0) { decimal precoSemIva = precoComIva / (1 + Iva / 100); dgv_Filho.CurrentRow.Cells["PrecoFilhoSemIva"].Value = precoSemIva; } } } }
关键改动说明
- 列判断逻辑:通过
e.ColumnIndex获取当前编辑列,区分是不含VAT列还是含VAT列,执行对应计算方向 - 安全转换:用
decimal.TryParse替代直接Convert,避免空值或格式错误导致的异常 - 边界处理:增加税率为-100%的判断,防止除零错误;同时过滤负数价格,保证计算合理性
- 联动逻辑:
- 不含VAT转含VAT:
价格 * (1 + 税率/100) - 含VAT转不含VAT:
价格 / (1 + 税率/100)
- 不含VAT转含VAT:
内容的提问来源于stack exchange,提问作者Hariche Arquissandas
相关产品推荐
相关产品推荐

