![](/img/trans.png)
[英]CellValueChanged vs CellValidating Events for DataGridView
[英]Winforms DataGridView CellValidating and CellValueChanged
我有一个BindingList<T>
作为DataSource
的DataGridView
。 我让用户将值输入到一列中,并且我有一种根据输入来计算其他列值的方法。
现在,当我将方法放入CellValueChanged
事件中时,值将在离开编辑单元格时进行计算。
但是,当我将方法放入CellValidating
事件时,值将在我离开下一个单元格时进行计算。 为了更清楚地说明我第二次按Enter。 如果在编辑单元格后立即切换到另一个控件,则根本不会执行我的方法。
我做了一些测试。 我在CellValidating
方法后在消息框中添加了TryParse。 当我尝试离开一个单元格时,将立即显示消息框,而当我离开下一个单元格(第二个Enter)时,仍然会运行计算。
为什么会这样呢? 这是什么原因引起的?
编辑
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
,单元仍具有旧值。 然后值被更新。 然后,当验证下一个单元格时,将再次执行计算方法,并使用上一个单元格的新值进行计算。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.