Necesito hacer datagridview que solo acepte el valor numérico para una columna específica solo en el evento keypress. ¿Hay alguna forma de hacerlo?Hacer que una columna específica solo acepte valores numéricos en datagridview en Keypress event
Respuesta
- añadir un evento de EditingControlShowing
- En EditingControlShowing, comprobar que si la celda actual se encuentra en la columna deseada.
- Registre un nuevo evento de KeyPress en EditingControlShowing (si la condición anterior es verdadera).
- Elimina cualquier evento KeyPress agregado previamente en EditingControlShowing.
- En el evento KeyPress, compruebe que si la clave no es un dígito, cancele la entrada.
Ejemplo:
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
e.Control.KeyPress -= new KeyPressEventHandler(Column1_KeyPress);
if (dataGridView1.CurrentCell.ColumnIndex == 0) //Desired Column
{
TextBox tb = e.Control as TextBox;
if (tb != null)
{
tb.KeyPress += new KeyPressEventHandler(Column1_KeyPress);
}
}
}
private void Column1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar))
{
e.Handled = true;
}
}
Debe utilizar DataGridView.CellValidating Event así:
private void dataGridView1_CellValidating(object sender,
DataGridViewCellValidatingEventArgs e)
{
if (e.ColumnIndex == 1) // 1 should be your column index
{
int i;
if (!int.TryParse(Convert.ToString(e.FormattedValue), out i))
{
e.Cancel = true;
label1.Text ="please enter numeric";
}
else
{
// the input is numeric
}
}
}
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
e.Control.KeyPress -= new KeyPressEventHandler(Column1_KeyPress);
if (dataGridView1.CurrentCell.ColumnIndex == 4) //Desired Column
{
TextBox tb = e.Control as TextBox;
if (tb != null)
{
tb.KeyPress += new KeyPressEventHandler(Column1_KeyPress);
}
}
}
private void Column1_KeyPress(object sender, KeyPressEventArgs e)
{
// allowed only numeric value ex.10
//if (!char.IsControl(e.KeyChar)
// && !char.IsDigit(e.KeyChar))
//{
// e.Handled = true;
//}
// allowed numeric and one dot ex. 10.23
if (!char.IsControl(e.KeyChar)&& !char.IsDigit(e.KeyChar)
&& e.KeyChar != '.')
{
e.Handled = true;
}
// only allow one decimal point
if (e.KeyChar == '.'
&& (sender as TextBox).Text.IndexOf('.') > -1)
{
e.Handled = true;
}
}
Private WithEvents txtNumeric As New DataGridViewTextBoxEditingControl
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
txtNumeric = CType(e.Control, DataGridViewTextBoxEditingControl)
End Sub
Private Sub txtNumeric_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtNumeric.KeyPress
If (DataGridView1.CurrentCell.ColumnIndex > 0) Then
If (Not Char.IsControl(e.KeyChar) And Not Char.IsDigit(e.KeyChar) And Not e.KeyChar = ".") Then
e.Handled = True
Else
'only allow one decimal point
If (e.KeyChar = "." And txtNumeric.Text.Contains(".")) Then
e.Handled = True
End If
End If
End If
End Sub
Formatea tu respuesta correctamente – HaveNoDisplayName
La respuesta dada es excelente a menos que requiera cifras decimales como otros han señalado. En este caso es necesario ampliar la validación, añadir el uso y VARs abajo para obtener un valor de la variable de cultivo para el separador decimal
using System.Globalization;
NumberFormatInfo nfi = Thread.CurrentThread.CurrentCulture.NumberFormat;
char decSeperator;
decSeperator = nfi.CurrencyDecimalSeparator[0];
Extender la validación para:
if (!char.IsControl(e.KeyChar) && !(char.IsDigit(e.KeyChar)
| e.KeyChar == decSeperator))
{
e.Handled = true;
}
// only allow one decimal point
if (e.KeyChar == decSeperator
&& (sender as TextBox).Text.IndexOf(decSeperator) > -1)
{
e.Handled = true;
}
Me gusta la validación extendida. Sin embargo, noté que nunca se aceptó un carácter decimal como KeyChar válido porque KeyPressEventArgs devolvió verdadero incluso al ingresar el primer decimal en el cuadro de texto. Agregué 'else if (e.KeyChar == decSeparator) {e.Handled = false; } 'como parte de la condición de IndexOf. Gracias – voidmain
Referencia de objeto no establecida en una instancia de un objeto. –
- 1. Rails 3 - Hacer que el campo de texto acepte solo valores numéricos
- 2. ¿Cómo obtener solo valores numéricos de columna?
- 3. ¿Cómo puedo hacer que NSMutableArray solo acepte valores únicos?
- 4. ¿Cómo hacer que GREP seleccione solo valores numéricos?
- 5. Permitir solo valores numéricos en el cuadro de texto
- 6. Cómo contar el número de valores numéricos en una columna
- 7. ¿Cómo hacer que un TextBox acepte solo caracteres alfabéticos?
- 8. cómo mostrar los valores de enumeración en la columna DataGridView
- 9. DataGridView: centrar una celda específica
- 10. C# datagridview columna en una matriz
- 11. .keypress en una etiqueta DIV?
- 12. ¿Cómo puedo encontrar un valor en una columna que solo tiene valores únicos con EclipseLink?
- 13. Validación en una sola columna DataGridView
- 14. ¿Cómo se permite editar solo una columna en particular en datagridview en la aplicación de Windows?
- 15. Ordenar con valores numéricos
- 16. jquery keypress event disparando un par de veces
- 17. Cómo establecer el texto del encabezado de columna para la columna específica en Datagridview C#
- 18. Cómo agregar valores numéricos que se almacenan en cadenas?
- 19. ¿Cómo puedo hacer que un socket acepte conexiones solo desde el localhost (en Java)?
- 20. DataGridView: ¿cómo congelar una columna?
- 21. Java JTable - Hacer solo una columna editable
- 22. Hacer solo una columna de QTreeWidgetItem editable
- 23. Python: ¿Cómo hacer que StringIO.writelines acepte una cadena unicode?
- 24. jquery keypress event object keyCode for firefox problem?
- 25. Convertir UTF8 en valores numéricos en Perl
- 26. Formato TimeSpan en la columna DataGridView
- 27. ¿Podría hacer que una columna en una tabla solo permita un valor "verdadero" y todas las demás filas sean "falsas"
- 28. Obtener el número de valores que solo aparece una vez en una columna
- 29. Niveles Log4Net Valores numéricos
- 30. cómo cambiar el color de una columna en datagridview?
No critico esta respuesta, pero indicando un comentario general: ¿No sería agradable poder configurar un formateador de algún tipo en una columna con formateadores predeterminados como 'AllowNumericOnly' más o menos. Como una propiedad –
¡Excelente respuesta! Esto evita que escriban datos no válidos. Sin embargo, me gustaría agregar que usar un índice de columna codificado no es una gran idea. Yo recomendaría usar 'if (dataGridView1.CurrentCell.ColumnIndex == dataGridView1.Columns [" name "]. Index)' –
@druciferre Aún mejor: 'dataGridView1.CurrentCell.ColumnIndex == dataGridView.Columns.IndexOf (dataGridViewColumn1);' –