单元格数据变化或新行增加时的触发计算公式,请问这个怎么实现;

请教一下,下述库存,我设定的公式,是在cellendedit事件下面,本意是操作员完成单元格的数据编辑后,就是触发计算公式,但在实际操作时,需要操作人员输入完成后,还要再反复点击单元格,才会计算,很不方便,请问能否实现,一发现数据有变化,或有新行出现,立即就能触发计算呢,方便实际操作,请指导一下;

img



```c#

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {                    

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (e.RowIndex < 1)
                {
                   MessageBox.Show("请从第二行录入数据");

                   return;
                }
                
                string PreMaterial = dataGridView1.Rows[e.RowIndex - 1].Cells[2].Value.ToString();

                string CurMaterial = dataGridView1.Rows[e.RowIndex].Cells[2].Value.ToString();


                if (PreMaterial != CurMaterial )
                {
                    return;
                }

                else
                {                

                    if (e.RowIndex > 0) // 不是第一行
                    {
                        int rowIndex = e.RowIndex;

                        decimal 上一行结存数量 = Convert.ToDecimal(dataGridView1.Rows[rowIndex - 1].Cells[6].Value);                  

                        decimal 当前行入库数量, 当前行出库数量;

                        if (dataGridView1.Rows[rowIndex].Cells[4].Value == DBNull.Value)
                        {
                            当前行入库数量 = 0;
                        }

                        else
                        {
                            当前行入库数量 = Convert.ToDecimal(dataGridView1.Rows[rowIndex].Cells[4].Value);
                        }

                        if (dataGridView1.Rows[rowIndex].Cells[5].Value == DBNull.Value)
                        {
                            当前行出库数量 = 0;
                        }

                        else
                        {
                            当前行出库数量 = Convert.ToDecimal(dataGridView1.Rows[rowIndex].Cells[5].Value);
                        }

                       decimal 当前行结存数量 = 上一行结存数量 + 当前行入库数量 - 当前行出库数量;

                       当前行结存数量 = Math.Round(当前行结存数量, 2, MidpointRounding.AwayFromZero);
                       //当前行结存数量 = (float)Math.Round(上一行结存数量, 2);

                        dataGridView1.Rows[rowIndex].Cells[6].Value = 当前行结存数量.ToString("0.00");
                        //dataGridView1.Rows[rowIndex].Cells[6].Value = 上一行结存数量.ToString("0.00");
                    }
                  
                }

            }                      
        
        }

```

把 DataGridView 的 EditMode 属性改为 DataGridViewEditMode.EditOnKeystroke 试试看

【以下回答由 GPT 生成】

在DataGridView控件的CellEndEdit事件中实现即时触发计算公式的功能可以通过以下步骤来实现:

  1. 创建一个新的方法来处理计算公式,例如CalculateFormula。在该方法中编写计算公式的逻辑。

```javascript private void CalculateFormula(int rowIndex) { // 获取当前行的数据

 // 根据需要的单元格数据,进行计算公式逻辑

 // 更新需要展示计算结果的单元格的值

} ```

  1. 在DataGridView的构造函数或其他适合的地方,将CalculateFormula方法绑定到DataGridView的CellValueChanged事件上,如下所示:

javascript dataGridView1.CellValueChanged += (s, e) => CalculateFormula(e.RowIndex);

  1. 在dataGridView1_CellEndEdit方法中调用CalculateFormula方法来即时触发计算公式,如下所示:

```javascript private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) { // 确保行数大于0 if (e.RowIndex < 0) { return; }

 // 调用CalculateFormula方法
 CalculateFormula(e.RowIndex);

} ```

这样,当操作员完成单元格的数据编辑时,CalculateFormula方法会被立即调用,从而触发计算公式,并更新需要展示计算结果的单元格的值。

如果需要在新行增加时也触发计算公式,可以在DataGridView的RowsAdded事件中调用CalculateFormula方法,如下所示:

javascript dataGridView1.RowsAdded += (s, e) => CalculateFormula(e.RowIndex);

这样,当有新行增加时,CalculateFormula方法也会被立即调用,触发计算公式。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^