2012-09-28 65 views

Respuesta

53
  • 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; 
    } 
} 
+3

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 –

+4

¡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)' –

+0

@druciferre Aún mejor: 'dataGridView1.CurrentCell.ColumnIndex == dataGridView.Columns.IndexOf (dataGridViewColumn1);' –

25

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 
      } 
     } 
    } 
3
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; 
     } 
    } 
1
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 
+0

Formatea tu respuesta correctamente – HaveNoDisplayName

2

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

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

+0

Referencia de objeto no establecida en una instancia de un objeto. –

Cuestiones relacionadas