Faire en sorte qu’une colonne spécifique accepte uniquement les valeurs numériques dans datagridview dans l’événement Keypress

J’ai besoin de faire datagridview qui accepte uniquement la valeur numérique pour une colonne spécifique uniquement dans l’événement touche presse. Y at-il une meilleure façon de faire cela?

  • Ajouter un événement de EditingControlShowing
  • Dans EditingControlShowing, vérifiez si la cellule actuelle se trouve dans la colonne souhaitée.
  • Enregistrez un nouvel événement de KeyPress dans EditingControlShowing (si la condition ci-dessus est vraie).
  • Supprimez tout événement KeyPress ajouté précédemment dans EditingControlShowing.
  • Dans l’événement KeyPress, vérifiez que si la clé n’est pas numérique, annulez la saisie.

Exemple:

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

Vous devez utiliser DataGridView.CellValidating Event comme ceci:

  private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { if (e.ColumnIndex == 1) // 1 should be your column index { int i; if (!int.TryParse(Convert.ToSsortingng(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 réponse donnée est excellente sauf si vous avez besoin de décimales, comme d’autres l’ont souligné. Dans ce cas, vous devez étendre la validation, append les options using et vars ci-dessous pour obtenir une valeur de variable de culture pour le séparateur décimal.

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

Étendre la validation à:

 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