Hacer que una columna específica solo acepte valores numéricos en datagridview en Keypress event

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?

  • Agregar un evento de EditingControlShowing
  • En EditingControlShowing, compruebe 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).
  • Elimine cualquier evento de 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 usar el Evento DataGridView.CellValidating de la siguiente manera:

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

La respuesta dada es excelente a menos que requiera decimales como otros señalaron. En este caso, necesita extender la validación, agregar el uso y los valores a continuación para obtener un valor de variable cultural para el separador decimal

 using System.Globalization; NumberFormatInfo nfi = Thread.CurrentThread.CurrentCulture.NumberFormat; char decSeperator; decSeperator = nfi.CurrencyDecimalSeparator[0]; 

Extienda la validación a:

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