Winforms DataGridView CellValidating和CellValueChanged

时间:2013-06-16 07:28:00

标签: c# winforms datagrid

我的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);
                }
            }

        }

1 个答案:

答案 0 :(得分:1)

我已经考虑过了,这种方式工作的原因很简单。触发CellValidating时,单元格仍具有旧值。然后更新值。然后,当验证下一个单元时,再次执行计算方法,并使用前一个单元的新值进行计算。