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?
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