Make a specific column only accept numeric value in datagridview in Keypress event

后端 未结 6 2095
傲寒
傲寒 2020-11-29 21:54

I need to make datagridview that only accept the numeric value for specific column only in keypress event. Is there any best way to do this?

相关标签:
6条回答
  • 2020-11-29 22:00
    • Add an event of EditingControlShowing
    • In EditingControlShowing, check that if the current cell lies in the desired column.
    • Register a new event of KeyPress in EditingControlShowing(if above condition is true).
    • Remove any KeyPress event added previously in EditingControlShowing.
    • In KeyPress event, check that if key is not digit then cancel the input.

    Example:

    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;
        }
    }
    
    0 讨论(0)
  • 2020-11-29 22:02

    You must use DataGridView.CellValidating Event like this :

        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 
                }
            }
        }
    
    0 讨论(0)
  • 2020-11-29 22:04
    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 讨论(0)
  • 2020-11-29 22:05
     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;
            }
        }
    
    0 讨论(0)
  • 2020-11-29 22:06

    The answer given is excellent unless you require decimal places as others have pointed out. In this event you need to extend the validation, add the using and vars below to get a culture variable value for the decimal separator

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

    Extend the validation to:

    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 讨论(0)
  • 2020-11-29 22:25

    You could also try this way, with accept decimals character

        private void Column1_KeyPress(object sender, KeyPressEventArgs e) 
        {
            //allow number, backspace and dot
            if (!(char.IsDigit(e.KeyChar) || e.KeyChar == (char)Keys.Back || e.KeyChar == '.'))
            {
                e.Handled = true;
    
            }
            //allow only one dot
            if (e.KeyChar == '.' && (sender as TextBox).Text.Contains("."))
            {
                e.Handled = true;
    
            }
        }
    
    0 讨论(0)
提交回复
热议问题