2011-01-20 66 views
22

Me gustaría manipular una celda en mi DataGridView cuando está validando para que si el usuario ingresa un valor que no es válido para la base de datos, pero se convierte fácilmente en datos válidos, el programa cambie el valor a uno apropiado.Validación de DataGridView y cambio de valor de celda

Puedo validar mi valor correctamente, pero cuando intento cambiarlo a algo válido obtengo un DataError. Aquí está mi código:

 private void unit_List_2_GroupsDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
    { 
     Console.WriteLine("Validating"); 
     DataGridViewColumn col = this.unit_List_2_GroupsDataGridView.Columns[e.ColumnIndex]; 
     DataGridViewCell cell = this.unit_List_2_GroupsDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex]; 
     if (col == this.batchDataGridViewTextBoxColumn && this.unit_List_2_GroupsDataGridView.IsCurrentCellInEditMode) 
     { 
      Console.WriteLine(" Batch Column"); 
      DataRow[] rows = label_EntryDataSet.viewJobBatchList.Select(String.Format("Job={0} AND Display='{1}'" 
       , comboBox1.SelectedValue, e.FormattedValue)); 
      if (rows.Length == 1) 
      { 
       Console.WriteLine("  Auto Completed item from list: {0}", rows[0]["Batch"]); 
       //e.Cancel = true; 
       cell.Value = rows[0]["Batch"]; 
       //this.unit_List_2_GroupsDataGridView.EndEdit(); 
      } 
      else 
      { 
       Console.WriteLine("  No Autocomplete!"); 
       int i = 0; 
       if (!int.TryParse(e.FormattedValue.ToString(), out i)) 
       { 
        Console.WriteLine("   Not an integer either"); 
        e.Cancel = true; 
       } 
      } 
     } 
    } 

La línea que dice Celda.Value = filas [0] [ "lotes"]; no está haciendo lo que espero que haga.

+0

Por favor, publique el mensaje de error exacto y señale qué línea de código se menciona. – David

Respuesta

39

El evento CellValidating se produce justo antes de que el DataGridView abandone el modo de edición; es un evento que se relaciona con/implica el control de edición (DataGridView.EditingControl). Nunca debe intentar cambiar el valor de celda en el controlador para este evento, ya que a menos que cancele el evento (en cuyo caso el usuario está atascado en el modo de edición), el valor de celda se establece en el control de edición inmediatamente después del evento finaliza Esto, por lo tanto, deshace cualquier acción que realice en el controlador.

Lo que debe hacer en su lugar es cambiar el valor en el control de edición (recordando no cancelar el evento). Por ejemplo, para un DataGridViewTextBoxCell, se utilizaría el siguiente lugar de su línea problemática:

unit_List_2_GroupsDataGridView.EditingControl.Text = Convert.ToString(rows[0]["Batch"]); 

Usted debe encontrar que esto resuelve su problema.

+0

Eso de hecho resolvió mi problema. Muchas gracias. – Micah

+0

y mi. Gracias. –

+0

¡Justo lo que necesitaba, gracias! –

3

En general, es mejor utilizar el evento CellParsing siempre que necesite convertir/cambiar el valor en una celda. Desde ese evento, puede indicar que el valor del usuario no es válido configurando el valor ErrorText de la celda o fila.

Cuestiones relacionadas