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