Tengo un DataGridView que está enlazado a un DataTable, que tiene una columna que es un doble y los valores que tenga que estar entre 0 y 1. Aquí está mi códigoDataGridView validar valor antiguo insted del nuevo valor
private void dgvImpRDP_InfinityRDPLogin_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (e.ColumnIndex == dtxtPercentageOfUsersAllowed.Index)
{
double percentage;
if(dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value.GetType() == typeof(double))
percentage = (double)dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value;
else if (!double.TryParse(dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value.ToString(), out percentage))
{
e.Cancel = true;
dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = "The value must be between 0 and 1";
return;
}
if (percentage < 0 || percentage > 1)
{
e.Cancel = true;
dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = "The value must be between 0 and 1";
}
}
}
Sin embargo, mi problema cuando dgvImpRDP_InfinityRDPLogin_CellValidating
dispara dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value
contendrá el valor anterior antes de la edición, no el nuevo valor.
Por ejemplo digamos el valor anterior fue 0,1 y entro 3. El código anterior se ejecuta al salir de la celda y dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].Value
será 0,1 para esa ejecución, el código es válido y escribe los datos a la DataTable.
Hago clic una segunda vez, trato de irme, y esta vez se comporta como debería, levanta el icono de error de la celda y me impide irme. Intento ingresar el valor correcto (digamos .7) pero el Value
seguirá siendo 3 y ahora no hay forma de salir de la celda porque está bloqueado debido al error y mi código de validación nunca empujará el nuevo valor.
Cualquier recomendación sería muy apreciada.
EDIT - Nueva versión del código basado en la sugerencia de Stuart e imitando el estilo que usa el artículo de MSDN. Todavía se comporta igual.
private void dgvImpRDP_InfinityRDPLogin_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (e.ColumnIndex == dtxtPercentageOfUsersAllowed.Index)
{
dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = String.Empty;
double percentage;
if (!double.TryParse(dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].FormattedValue.ToString(), out percentage) || percentage < 0 || percentage > 1)
{
e.Cancel = true;
dgvImpRDP_InfinityRDPLogin[e.ColumnIndex, e.RowIndex].ErrorText = "The value must be between 0 and 1";
return;
}
}
}
No, 'dgvImpRDP_InfinityRDPLogin [e.ColumnIndex, e.RowIndex] .FormattedValue' =" 0.1" después de haber introducido 5 –
Nop. ¡Tienes que mirar e.FormattedValue! – stuartd
¡Ah! gracias, ni siquiera noté el valor formateado dentro de e. –