¿Cómo puedo enganchar el ErrorProvider con celdas individuales en el control DataGridView?Windows Forms - ErrorProvider + DataGridView
Respuesta
No estoy seguro de que pueda usar el ErrorProvider de esta manera, sin embargo, el DataGridView tiene una funcionalidad integrada que es básicamente la misma idea.
La idea es simple. Un DataGridViewCell tiene una propiedad ErrorText. Lo que hace es manejar el evento OnCellValidating y si falla la validación, establece la propiedad de texto de error y obtiene el icono rojo de error para que aparezca en la celda. Aquí hay un código de pseudo:
public Form1()
{
this.dataGridView1.CellValidating += new DataGridViewCellValidatingEventHandler(dataGridView1_CellValidating);
}
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (!this.Validates(e.FormattedValue)) //run some custom validation on the value in that cell
{
this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = "Error";
e.Cancel = true; //will prevent user from leaving cell, may not be the greatest idea, you can decide that yourself.
}
}
Puede agregar una columna (como DataGridViewTextBoxColumn) a dataGridView.Columns que tiene el CellTemplate configurado para su propia implementación (digamos, heredado de DataGridViewTextBoxCell). Luego, en su implementación, maneje la validación a su gusto, renderizando y posicionando el panel de edición para que se ajuste a sus necesidades.
Puede consultar una muestra en http://msdn.microsoft.com/en-us/library/aa730881(VS.80).aspx.
Pero, de nuevo, podría haber una solución más simple.
private void myGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
var dataGridView = (DataGridView)sender;
var cell = dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex];
if (...) // Validation success
{
cell.ErrorText = string.Empty;
return;
}
dataGridView.EndEdit();
cell.ErrorText = error;
e.Cancel = true;
}
Usted sólo puede poner en práctica en sus IDataErrorInfo
BusinessObjects, y establecer el BindingSource como fuente de datos para la ErrorProvider también. De esta forma, su validación interna de BusinessObject aparece en el DataGrid y en todos los campos donde los objetos están destinados automáticamente.
El problema que tengo con la solución de BFree es que no aparece nada mientras la celda está en modo de edición, pero si termino la edición, aparece un error de formato de datos (porque mi valor es doble). Lo resolví adjuntando el ErrorProvider directamente al control de edición de celdas como este:
private ErrorProvider ep = new ErrorProvider();
private void DGV_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (e.ColumnIndex < 0 || e.RowIndex < 0)
return;
double val;
Control edit = DGV.EditingControl;
if (edit != null && ! Double.TryParse(e.FormattedValue.ToString(), out val))
{
e.Cancel = true;
ep.SetError(edit, "Numeric value required");
ep.SetIconAlignment(edit, ErrorIconAlignment.MiddleLeft);
ep.SetIconPadding(edit, -20); // icon displays on left side of cell
}
}
private void DGV_CellEndEdt(object sender, DataGridViewCellEventArgs e)
{
ep.Clear();
}
- 1. WPF DataGrid Vs Windows Forms DataGridView
- 2. Vinculación de colecciones a DataGridView en Windows Forms
- 3. WPF o Windows Forms
- 4. Windows Forms: capturar MouseWheel
- 5. Windows Forms Separator Control
- 6. Cambio automático de tamaño de los controles de Windows Forms
- 7. Windows Forms control DataGridView tiene diferentes tipos de control en la misma columna
- 8. ¿Cómo puedo obtener un Windows Forms DataGridView para mostrar nuevos registros cuando se une a EntityCollection
- 9. Learning Windows Forms vs. Windows Presentation Foundation
- 10. Tab Index en Windows Forms
- 11. Restore C# Windows Forms backcolor
- 12. Windows Forms - Multiple Event Loops
- 13. WPF con Windows Forms - STAThread
- 14. Windows Forms and ShowDialog problema
- 15. Borrando DrawRectangle en Windows Forms
- 16. Jump Lists y Windows Forms
- 17. Validar múltiples cuadros de texto usando errorprovider
- 18. WPF equivalente a Application.AddMessageFilter (Windows Forms)
- 19. Fuerte tipo de Windows Forms databinding
- 20. this.Visible no funciona en Windows Forms
- 21. ProgressBar es lenta en Windows Forms
- 22. Barra de estado en C# Windows Forms
- 23. Windows Forms Posición del cursor RichTextBox
- 24. Fuente predeterminada para la aplicación Windows Forms
- 25. Animación simple usando C#/Windows Forms
- 26. Imagen simple en Windows Forms Control StatusStrip
- 27. ¿Evita el parpadeo en Windows Forms?
- 28. ¿Globalizar una aplicación existente de Windows Forms?
- 29. Windows Forms Control e iframes de WebBrowser
- 30. Abrir una URL de Windows Forms
He intentado configurar la propiedad ErrorText. ¡No pasa nada durante el tiempo de ejecución! –
Eso es extraño, debería funcionar ... Solo asegúrese de que su ErrorTexto no sea una cadena vacía, porque eso elimina el error. –
Debería funcionar, acabo de probarlo. Lo único que se me ocurre es que DataGridView tiene una propiedad ShowCellErrors. Asegúrate de que no esté configurado en falso. – BFree