2013-06-16 4 views
1

У меня есть DataGridView с BindingList<T> как DataSource. Я позволяю вводить пользовательские значения в один столбец, и у меня есть метод для вычисления других значений столбца в зависимости от ввода.Winforms DataGridView CellValidating и CellValueChanged

Теперь, когда я помещаю свой метод в событие CellValueChanged, значение вычисляется, когда я оставляю отредактированную ячейку.

Но, когда я поместил свой метод в событие CellValidating, значение вычисляется при выходе из следующей ячейки. Чтобы сделать его более понятным, когда я нажимаю Enter во второй раз. Если я переключусь на другой элемент управления сразу после редактирования ячейки, мой метод вообще не выполняется.

Я проверил некоторые испытания. Я добавил TryParse с полем сообщений после моего метода в CellValidating. Ящик сообщений отображается сразу же, когда я пытаюсь покинуть ячейку, все еще выполняется подсчет, когда я покидаю следующую ячейку (второй ввод).

Почему это происходит? Что это может быть вызвано?

Редактировать

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

     } 
+0

Необходимо указать соответствующий код – Shaharyar

ответ

1

Я думал об этом, и причина этого работает таким образом очень просто. Когда CellValidating уволен, ячейка по-прежнему имеет старое значение. Затем значение обновляется. Затем, когда следующая ячейка проверяется, метод расчета выполняется снова, и для вычисления используется новое значение предыдущей ячейки.

+1

Точно. Когда «CellValidating» срабатывает, ячейка содержит старое значение. Вы можете получить доступ к новому значению с помощью аргументов события, например. 'e.FormattedValue' – MarkJ

Смежные вопросы