【问题标题】:Winforms DataGridView CellValidating and CellValueChangedWinforms DataGridView CellValidating 和 CellValueChanged
【发布时间】:2013-06-16 07:27:59
【问题描述】:

我有一个DataGridViewBindingList<T> 作为DataSource。我让用户将值输入到一列中,并且我有一种根据输入计算其他列值的方法。

现在,当我将我的方法放入 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);
                }
            }

        }

【问题讨论】:

  • 需要出示相关代码

标签: c# winforms datagrid


【解决方案1】:

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

【讨论】:

  • 没错。当CellValidating 触发时,单元格包含旧值。您可以通过事件参数访问新值,例如e.FormattedValue
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 2014-06-28
  • 2015-04-21
  • 1970-01-01
相关资源
最近更新 更多