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

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)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:15:48