2010-03-17 17 views
5

Tengo un DataGridView que está vinculado a una lista de objetos. Tiene algunas columnas que el usuario puede editar. Hay ciertas entradas que no están permitidas para una fila como un todo. ¿Cómo puedo retrotraer si el usuario ingresa entradas no válidas en alguna celda? Intenté utilizar el controlador de eventos RowValidating pero no se invocó después de que se modificó el valor de celda. Incluso cuando implemento CellValueChanged, todavía no puedo deshacer los cambios. ... alguna idea de cómo lograr estoCómo deshacer los cambios en la vista de cuadrícula en caso de entrada incorrecta

Respuesta

5

Una vez que se ha completado la edición y validar los cambios, puede hacer esto:

DataTable dt = this.dataGridView.DataSource as DataTable; 
dt.RejectChanges(); 

De MSDN:

Cuando el DataTable Se llama al método .RejectChanges , las filas que aún están en edit-mode cancelan sus ediciones. Se eliminan las nuevas filas . Las filas modificadas y eliminadas vuelven a su estado original (DataRowState.Unchanged).

+1

dt.RejectChanges() me está dando NullReferenceExcpetion althu el origen de datos no es nulo – mustafabar

+2

Esto significa que no puede convertir el origen de datos en un DataTable. –

+0

Acabo de hacer 'myDataSet1.myDataTable.RejectChanges();' Estoy usando un BindingSource como DataSource de mi DGV. ¡Muchas gracias! funcionó para mí. – WhySoSerious

10

Cuando existe enlace de datos, para mí es que funciona con:

myBindingSource.CancelEdit(); 
myDataGridView.RefreshEdit(); 
+2

Hmm ... No funciona aquí. – Hossein

+6

'datagridview.CancelEdit()' funcionó para mí perfectamente! – Vbp

0

Usted puede utilizar el evento CellValidating para comprobar el contenido de la celda justo antes de que se ha comprometido. Si no te gusta (sean cuales sean tus reglas de validación), tienes algunas opciones.

1) Puede cancelar el evento. El usuario obtiene un ícono de error en la fila y no puede salir de la celda. Están encerrados en el comportamiento de edición de la celda hasta que comprometen la celda (Intro, Tabulador) con datos válidos.

2) Puede revertir el valor a otro valor (el valor anterior, algún valor predeterminado).

private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 
{ 
    DataGridView grid = sender as DataGridView; 
    if (grid.Columns[e.ColumnIndex].HeaderText == "Text ID") 
    { 
     // Suppose you want to prevent them from leaving a cell when the text 
     // in a specific column contains spaces: 

     // value will hold the new data 
     string value = (string)e.FormattedValue; 

     if (value.Contains(" ")) 
     { 
      grid.Rows[e.RowIndex].ErrorText = "String IDs cannot contain spaces."; 
      // Setting e.Cancel will prevent them from leaving the cell. 
      e.Cancel = true; 
     } 
    } 
    else if (grid.Columns[e.ColumnIndex].HeaderText == "Platform") 
    { 
     // Or, suppose you have another column that can only contain certain values. 
     // You could have used a ComboBoxColumn, but it didn't play with paste, or something. 
     if (grid.EditingControl != null && (string)e.FormattedValue != "All") 
     { 
      // Going straight to the EditingControl will allow you to overwrite what 
      // the user thought they were going to do. 

      // Note: You don't want to e.Cancel here, because it will lock them 
      // into the cell. This is just a brute force fix by you. 
      string oldvalue = (string)grid.Rows[e.RowIndex].Cells[e.ColumnIndex].Value; 
      grid.EditingControl.Text = "All"; // or set it to the previous value, if you like. 
     } 
    } 
} 
Cuestiones relacionadas