Validar datos de una celda en un datagridview

WebProgramacion > Recursos sobre informática y tecnología > Programacion > C# > Validar datos de una celda en un datagridview
C#
Autor: Dámaso Velázquez Álvarez
Imagen del ejemplo de la validación del DataGridView
Imagen del ejemplo de la validación del DataGridView

En el siguiente ejemplo vamos a ver cómo podemos validar que el valor de una columna de un DataGridView sea de tipo fecha (en nuestro ejemplo, la primera columna).

Cuando validamos un DataGridView podemos elegir entre:

  1. Validarlo a medida que el usuario introduce datos (celda a celda)
  2. Validarlo al final de la introducción de datos en varias celdas

En este caso vamos a implementar una solución para el primer caso, ya que si el número de datos introducidos en el DataGridView es muy alto, puede resultar muy complicado realizar la validación al final pudiendo haber introducido el usuario muchos datos.

Para ello usaremos el siguiente método ya comentado en otro artículo que nos valida si un dato es de tipo fecha o no:

private Boolean EsFecha(String fecha)
{
    try
    {
        DateTime.Parse(fecha);
        return true;
    }
    catch
    {
        return false;
    }
}

Para validar dicho dato necesitamos programar el evento CellValidating que se produce cuando salimos de una celda de la que hemos modificado el valor. En ese momento validaremos si el dato introducido es de tipo fecha o no. Esta validación sólo la realizaremos si la fila a validar no es la última (sobre la cual se añaden los valores nuevos cuando la propiedad AllowUserToAddRows está fijada al valor true).

void GrdEjemploCellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
    //Validamos si no es una fila nueva
    if (!grdEjemplo.Rows[e.RowIndex].IsNewRow)
    {
        //Sólo controlamos el dato de la columna 0
        if (e.ColumnIndex==0)
        {
            if (!this.EsFecha(e.FormattedValue.ToString()))
            {
                MessageBox.Show("El dato introducido no es de tipo fecha","Error de validación",
                                MessageBoxButtons.OK,MessageBoxIcon.Error);
                grdEjemplo.Rows[e.RowIndex].ErrorText="El dato introducido no es de tipo fecha";
                e.Cancel=true;
            }
        }    
    }
}

También debemos implementar el comportamiento de evento CellEndEdit que quitará el mensaje de error si el usuario pulsa la tecla ESC para cancelar los cambios:

void GrdEjemploCellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    //Elimina el mensaje de error de la cabecera de la fila
    grdEjemplo.Rows[e.RowIndex].ErrorText=String.Empty;
}

En este ejemplo hemos añadido la implementación del método ValuesNeeded que es de utilidad cuando el usuario puede añadir datos al DataGridView rellenando por él las celdas que puedan tener valores automáticos (valores por defecto):

void GrdEjemploDefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
{
    e.Row.Cells[0].Value=DateTime.Now.Date;
}