2009-04-27 22 views

Respuesta

5

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. 
      } 
     } 
+1

He intentado configurar la propiedad ErrorText. ¡No pasa nada durante el tiempo de ejecución! –

+0

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. –

+1

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

0

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.

1
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; 
} 
2

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.

5

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(); 
} 
Cuestiones relacionadas