winforms Datagridview动态单元格计算

sg3maiej  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(231)

我在Datagridview中有两列,一列用于不含增值税的价格,另一列用于包含增值税的价格,我希望它是动态的,如果我更改不含增值税的价格,它将更新包含增值税的列,如果我更新包含增值税的列,它将更新不含增值税的列,反之亦然。
如果有人能帮助我用C#编写正确的代码,我将不胜感激。
这里是代码I m,使用计算到一个方向,我需要代码的逆。

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;
                }
            }
        }
wdebmtf2

wdebmtf21#

使用您现有的代码,这并不太困难:首先,使用if/else if语句中已编辑列的名称来筛选应进行的转换,以便更改增值税列不会被增值税前列覆盖。
以下是它的外观:

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;
decimal PrecoFilho = Convert.ToDecimal(dgv_Filho.CurrentRow.Cells["PrecoFilhoSemIva"].Value);
decimal PrecoFilhoComIva = Convert.ToDecimal(dgv_Filho.CurrentRow.Cells["PrecoFilhoComIva"].Value);
if (dgv_Filho.Columns[e.ColumnIndex].Name == "PrecoFilhoSemIva")
{
    PrecoFilhoComIva = PrecoFilho * (Iva / 100) + PrecoFilho;
    dgv_Filho.CurrentRow.Cells["PrecoFilhoComIva"].Value = PrecoFilhoComIva;
}
else if (dgv_Filho.Columns[e.ColumnIndex].Name == "PrecoFilhoComIva")
{
    decimal PrecoFilhoSemIva = PrecoFilhoComIva - (PrecoFilhoComIva / (1 + (Iva / 100)) * (Iva / 100));
    dgv_Filho.CurrentRow.Cells["PrecoFilhoSemIva"].Value = PrecoFilhoSemIva;
}

使用此代码,编辑增值税前值将自动相应更新增值税后值,编辑增值税后值将自动相应更新增值税前值

m3eecexj

m3eecexj2#

与其直接与DataGridView交互(这可能会很复杂),不如创建一个实现INotifyPropertyChanged的类,并使其所有内部计算始终保持最新(这更容易)。下面是此类的简化版本,它响应DescricaoMedidaPrecoFilhoSemIva的更改。

表示一行数据的简化类

class Articulo : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    string _descricao = string.Empty;
    public string Descricao
    {
        get => _descricao;
        set
        {
            if (!Equals(_descricao, value))
            {
                _descricao = value;
                OnPropertyChanged();
            }
        }
    }
    public string Descricao_Pai => $"{Descricao} {Medida_1}@{_precoFilhoSemIva.ToString("F2")}";
    public decimal PrecoFilhoComIva => _precoFilhoSemIva * (1.0m + MainForm.Iva);

    decimal _medida = 0;
    public decimal Medida
    {
        get => _medida;
        set
        {
            if (!Equals(_medida, value))
            {
                _medida = value;
                OnPropertyChanged();
            }
        }
    }

    decimal _precoFilhoSemIva = 0;
    public decimal PrecoFilhoSemIva
    {
        get => _precoFilhoSemIva;
        set
        {
            if (!Equals(_precoFilhoSemIva, value))
            {
                _precoFilhoSemIva = value;
                OnPropertyChanged();
            }
        }
    }
    string _codigoArtigo = System.Guid.NewGuid().ToString().Substring(0, 10).ToUpper();
    public string CodigoArtigo
    {
        get => _codigoArtigo;
        set
        {
            if (!Equals(_codigoArtigo, value))
            {
                _codigoArtigo = value;
                OnPropertyChanged();
            }
        }
    }
}

此类的示例被放置在BindingList中,该BindingList被分配给dgv_FilhoDataSource属性,并导致DGV在调用Refresh方法时更新。

初始化

与DGV的唯一交互应该是在Load事件的MainForm覆盖中正确地初始化列和绑定。这也是我们将组合框绑定到Iva的静态值的地方,Iva可用于行项的计算。
第一个

相关问题