Winforms DataGridView CellValidating and CellValueChanged

本文关键字:CellValueChanged and CellValidating DataGridView Winforms | 更新日期: 2023-09-27 18:18:40

我有一个DataGridView, BindingList<T>作为DataSource。我允许用户在一列中输入值,并且我有一种方法可以根据输入计算其他列的值。

现在,当我把我的方法到CellValueChanged事件,值计算当我离开编辑单元格。

但是,当我把我的方法到CellValidating事件,值计算当我离开下一个单元格。当我第二次按Enter键时,它会更清晰。如果我在编辑单元格后立即切换到另一个控件,我的方法根本不会执行。

我做了一些测试。我在CellValidating的方法后添加了带有消息框的TryParse。当我尝试离开单元格时立即显示消息框,当我离开下一个单元格时仍然运行计算(第二次输入)。

为什么会发生这种情况?这是由什么引起的呢?

编辑

flightDataGridView.DataSource = flight.Ships;
BindingList<Ship> _ships = new BindingList<Ship>();
_ships.Add(new Ship([some stuff here]));
.
.

public void UpdateCargoCapacity()
        {
            foreach (Ship ship in _ships)
            {
                ship.CargoCapacity = ship.SingleCargoCapacity * ship.Quantity;
            }
            flightDataGridView.Refresh();
        }

private void flightDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            flight.UpdateCargoCapacity();
            if (e.ColumnIndex == 1)
            {
                int i;
                if (!int.TryParse(Convert.ToString(e.FormattedValue), out i))
                {
                    e.Cancel = true;
                    MessageBox.Show("Incorrect input", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

Winforms DataGridView CellValidating and CellValueChanged

我想过了,这样做的原因很简单。当CellValidating被触发时,单元格仍然具有旧值。然后更新值。然后,当验证下一个单元格时,再次执行计算方法,并使用前一个单元格的新值进行计算。