2015-08-31 2 views
0

У меня есть DataGridView. Мне нужно сравнить старые и новые значения ячеек и выполнить дальнейшие действия.Сравнение значений старых ячеек и новых ячеек в datagridview

Я пытался сравнивать с Cell Leave, CellValidating событий, используя следующий код,

private void TestGrid_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
{ 
    int currentCell = TestGrid.CurrentCell.ColumnIndex; 
    var oldCellValue = TestGrid[e.ColumnIndex, e.RowIndex].Value; 
    var newValue = e.FormattedValue; 
} 

возвращает мой Старое значение и новое значение, как, например, как: 1000, когда я пытаюсь нажав на другую ячейку.

Сообщите мне, если есть какие-либо другие события, благодаря которым я смогу достичь желаемого поведения. Также, если мне нужно сравнить старые и новые индексы строк или столбцов ячеек, то как действовать?

private void TestGrid_CellLeave(object sender, DataGridViewCellEventArgs e) 
{ 
    int currentCell = TestGrid.CurrentCell.ColumnIndex; 
    int oldCell = e.ColumnIndex;   
} 

Оба они возвращают тот же самый индекс.

+0

Как вы связываете DataSource datagrid? Этот источник данных может иметь всю информацию вам нужно – Steve

+0

, возможно, это может помочь вам http://stackoverflow.com/questions/13259013/compare-2-different-columns-in-the-datagridview –

+0

Стив Я связываю данные как, TestGrid.DataSource = dt; –

ответ

0

Попробуйте с EditedFormattedValue объект DataGridView. Испытано этот и я вижу различные значения:

private void TestGrid_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
{ 
    int currentCell = TestGrid.CurrentCell.ColumnIndex; 
    var oldValue = TestGrid[e.ColumnIndex, e.RowIndex].Value; 
    var newValue = TestGrid[e.ColumnIndex, e.RowIndex].EditedFormattedValue; 
    /* Perform some logic here*/ 
} 
+0

не позволяет мне использовать редактируемое свойство, его высказывание: «System.Windows.Forms.DataGridViewCellValidatingEventArgs не содержит определения для« EditedFormattedValue »и никакого метода расширения« EditedFormattedValue », принимающего первый аргумент типа« System.Windows ». Forms.DataGridViewCellValidatingEventArgs 'можно найти, если вы не указали директиву или ссылку на сборку? " –

+0

В некоторых случаях мне нужно сравнить только индексы столбцов, тогда как это будет работать, например, как: private void TestGrid_CellLeave (объект-отправитель, DataGridViewCellEventArgs e) { int currentCell = TestGrid.CurrentCell.ColumnIndex; int oldCell = e.ColumnIndex; –

+0

Opps, check edit ... мой плохой .. Было слишком лениво изменить имя сетки, потому что в моем тестовом проекте его datagridview1, поэтому я просто скопировал ваш и заменил свойство, но забыл, что вам нужно используйте индекс ... – Gnqz

0

Попробуйте преобразовать значения ячеек в строках и сделать что-то подобное, как это (пример кода приходит из MSDN). Надеюсь это поможет.

// Iterate through the SelectedCells collection and sum up the values. 
for (counter = 0; 
    counter < (DataGridView1.SelectedCells.Count); counter++) 
{ 
    if (DataGridView1.SelectedCells[counter].FormattedValueType == 
     Type.GetType("System.String")) 
    { 
     string value = null; 

     // If the cell contains a value that has not been commited, 
     // use the modified value. 
     if (DataGridView1.IsCurrentCellDirty == true) 
     { 

      value = DataGridView1.SelectedCells[counter] 
       .EditedFormattedValue.ToString(); 
     } 
     else 
     { 
      value = DataGridView1.SelectedCells[counter] 
       .FormattedValue.ToString(); 
     } 
     if (value != null) 
     { 
      // Ignore cells in the Description column. 
      if (DataGridView1.SelectedCells[counter].ColumnIndex != 
       DataGridView1.Columns["Description"].Index) 
      { 
       if (value.Length != 0) 
       { 
        SelectedCellTotal += int.Parse(value); 
       } 
      } 
     } 
    } 
+0

Это не помогает сравнивать индексы. –

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