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
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).
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.
}
}
}
- 1. Mercurial: ¿Cómo se pueden deshacer los cambios?
- 2. Deshacer cambios en las entidades del marco de entidades
- 3. Deshacer parte de los cambios sin estado en git
- 4. Anime los cambios de cuadrícula cuadráticos (matshow)
- 5. Arrastrando elementos en la vista de cuadrícula
- 6. factory_girl + rspec a deshacer los cambios después de cada ejemplo
- 7. ¿Cómo hacer que git ignore los cambios en el caso?
- 8. Convierta el valor de varchar a int sin lanzar una excepción en caso de entrada incorrecta
- 9. cómo borrar la vista de cuadrícula?
- 10. caso carriles de cambio en la vista
- 11. GIT agregar revertir en mi caso (mantener los cambios)
- 12. ancho de la vista de cuadrícula boundfield
- 13. Hipervínculo en la vista de cuadrícula de datos
- 14. Deshacer en Vinculaciones WPF
- 15. 68040 toma la rama incorrecta de otro caso
- 16. Adición dinámica de elementos de cuadrícula en la vista de cuadrícula
- 17. Cómo realizar el equivalente TFS de 'Deshacer cambios pendientes'
- 18. Git: use revertir o pagar para deshacer los cambios realizados?
- 19. Conflicto al intentar el ejemplo Deshacer cambios en Subversion
- 20. calendario de primos: entrada de fecha incorrecta
- 21. ¿Cómo permitir la clasificación de una vista de cuadrícula?
- 22. Cómo hacer vista de tamaño variable en caso de contacto
- 23. Python & SCons & Matlab: entrada de comando incorrecta
- 24. ¿Cómo implementar deshacer un solo paso para los cambios en SQLite DB?
- 25. ¿Cómo mostrar los cambios pendientes como una lista en lugar de una vista de árbol en VS2012?
- 26. ¿Cómo deshace los cambios realizados en un DataGridView encuadernado?
- 27. cómo implementar la operación de deshacer/rehacer sin grandes cambios en el programa
- 28. Cómo manejar una entrada de tipo de datos incorrecta
- 29. Deshacer en Subversion
- 30. Cómo manejar los cambios en los datos duplicados en NoSQL
dt.RejectChanges() me está dando NullReferenceExcpetion althu el origen de datos no es nulo – mustafabar
Esto significa que no puede convertir el origen de datos en un DataTable. –
Acabo de hacer 'myDataSet1.myDataTable.RejectChanges();' Estoy usando un BindingSource como DataSource de mi DGV. ¡Muchas gracias! funcionó para mí. – WhySoSerious