.net DataGridView 仅数字单元格?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19855943/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-03 12:32:07  来源:igfitidea点击:

DataGridView Numeric Only Cell?

.netvb.netwinformsdatagridview

提问by SamuraiHyman

I am new to winforms..I am trying to set two column of DataGridView to Numeric Only.. I do not want user to be able to type anything into a cell unless its a natural number in one column and a numeric value in another(which always one decimal). I thought this would be simple.. but even after trying a lot of things from stackoverflow and other sites i am still unable to achieve this.

我是 winforms 的新手..我试图将 DataGridView 的两列设置为仅数字.. 我不希望用户能够在单元格中输入任何内容,除非它是一列中的自然数和另一列中的数值(总是一位小数)。我认为这很简单..但即使在从 stackoverflow 和其他网站尝试了很多东西之后,我仍然无法实现这一目标。

If DataGridView1.CurrentCell.ColumnIndex = 8 Then

    If Not Char.IsControl(e.KeyChar) AndAlso Not Char.IsDigit(e.KeyChar) AndAlso e.KeyChar <> "."c Then
        e.Handled = True
    End If

End If 

回答by Sathish

Try this code

试试这个代码

 Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing

        If DataGridView1.CurrentCell.ColumnIndex = 2 Then

            AddHandler CType(e.Control, TextBox).KeyPress, AddressOf TextBox_keyPress

        ElseIf DataGridView1.CurrentCell.ColumnIndex = 1 Then

            AddHandler CType(e.Control, TextBox).KeyPress, AddressOf TextBox_keyPress1


        End If

    End Sub

    Private Sub TextBox_keyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)

        If Char.IsDigit(CChar(CStr(e.KeyChar))) = False Then e.Handled = True

    End Sub

    Private Sub TextBox_keyPress1(ByVal sender As Object, ByVal e As KeyPressEventArgs)

        If Not (Char.IsDigit(CChar(CStr(e.KeyChar))) Or e.KeyChar = ".") Then e.Handled = True

    End Sub

TextBox_keyPress Event for only numeric

TextBox_keyPress 事件仅用于数字

TextBox_keyPress1 Event for numeric with decimal value

TextBox_keyPress1 带有十进制值的数字事件

回答by Neeraj Kumar Gupta

If data type validation is only concern then you can use CellValidating event like this

如果只关注数据类型验证,那么您可以像这样使用 CellValidating 事件

    private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        //e.FormattedValue  will return current cell value and 
        //e.ColumnIndex & e.RowIndex will rerurn current cell position

        // If you want to validate particular cell data must be numeric then check e.FormattedValue is all numeric 
        // if not then just set  e.Cancel = true and show some message 
        //Like this 

        if (e.ColumnIndex == 1)
        {
            if (!IsNumeric(e.FormattedValue))  // IsNumeric will be your method where you will check for numebrs 
            {
                MessageBox.Show("Enter valid numeric data");
                dataGridView1.CurrentCell.Value = null;
                e.Cancel = true;

            }

        }

    }

回答by Dhanapandian P

If e.ColumnIndex = 6 Then
    If Not IsNumeric(e.FormattedValue) Then
        ' IsNumeric will be your method where you will check for numebrs 
        MessageBox.Show("Enter valid numeric data")
        DataGridView1.CurrentCell.Value = Nothing

        e.Cancel = True

    End If
End If

回答by Laxmikant Bhumkar

Following code is an extension of Satish's Solution. It will help to control values of DataGridView Cells. Textbox function has used to attach a cell to textbox-event only. No need to add a text box in a DataGridView or anywhere on the form.

以下代码是 Satish 解决方案的扩展。它将有助于控制 DataGridView 单元格的值。文本框函数仅用于将单元格附加到文本框事件。无需在 DataGridView 或表单上的任何位置添加文本框。

Private Sub DataGridView_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView.EditingControlShowing
    If DataGridView.CurrentCell.ColumnIndex = 2 Then 'Numeric column with decimal point
        AddHandler CType(e.Control, TextBox).KeyPress, AddressOf TextBox_keyPress

    ElseIf DataGridView.CurrentCell.ColumnIndex = 3 Then 'Numeric column without Decimal
        AddHandler CType(e.Control, TextBox).KeyPress, AddressOf TextBox_keyPress1

    ElseIf DataGridView.CurrentCell.ColumnIndex = 4 Then 'Selected Values only
        AddHandler CType(e.Control, TextBox).KeyPress, AddressOf TextBox_keyPress2

    ElseIf DataGridView.CurrentCell.ColumnIndex = 5 Then 'Email Column
        AddHandler CType(e.Control, TextBox).KeyPress, AddressOf TextBox_keyPress3

    End If

End Sub

Private Sub TextBox_keyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
    'Allows Numeric values, one decimal point and BackSpace key
    Dim numbers As Windows.Forms.TextBox = sender
    If InStr("1234567890.", e.KeyChar) = 0 And Asc(e.KeyChar) <> 8 Or (e.KeyChar = "." And InStr(numbers.Text, ".") > 0) Then
        e.KeyChar = Chr(0)
        e.Handled = True
    End If
End Sub

Private Sub TextBox_keyPress1(ByVal sender As Object, ByVal e As KeyPressEventArgs)
    'Allow Numeric values, BackSpace key. Disallows decimal point (i.e. dot) 
    Dim numbers As Windows.Forms.TextBox = sender
    If InStr("1234567890", e.KeyChar) = 0 And Asc(e.KeyChar) <> 8 Then
        e.KeyChar = Chr(0)
        e.Handled = True
    End If
End Sub


Private Sub TextBox_keyPress2(ByVal sender As Object, ByVal e As KeyPressEventArgs)
    'Allow selected values only
    If InStr("1234567890!@#$%^&*()_+=-", e.KeyChar) > 0 Then
        e.KeyChar = Chr(0)
        e.Handled = True
    End If
End Sub

Private Sub TextBox_keyPress3(ByVal sender As Object, ByVal e As KeyPressEventArgs)
    'Martch function, Needs to add "Imports System.Text.RegularExpressions" at the top of Class
    'Allows Email values
    Dim Email As Windows.Forms.TextBox = sender
    If Email.Text <> "" Then
        Dim rex As Match = Regex.Match(Trim(Email.Text), "^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,3})$", RegexOptions.IgnoreCase)
        If rex.Success = False Then
            MessageBox.Show("Please Enter a valid Email Address", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Email.BackColor = Color.Red
            Email.Focus()
            Exit Sub
        Else
            Email.BackColor = Color.White
        End If
    End If
End Sub

回答by Peterboy

Try this code. Its almost the same as the most votes answer, but I edited KeypressEventcodes to make it simple and you can use this even you have to enter decimal numbers. Enjoy. :)

试试这个代码。它与得票最多的答案几乎相同,但我编辑了KeypressEvent代码以使其简单,即使您必须输入十进制数字,您也可以使用它。享受。:)

Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing

    If DataGridView1.CurrentCell.ColumnIndex = 2 Then

        AddHandler CType(e.Control, TextBox).KeyPress, AddressOf TextBox_keyPress

    End If

End Sub

Private Sub TextBox_keyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)

     If (Not Char.IsControl(e.KeyChar) _
                AndAlso (Not Char.IsDigit(e.KeyChar) _
                AndAlso (e.KeyChar <> Microsoft.VisualBasic.ChrW(46)))) Then
        e.Handled = True
    End If

End Sub

回答by Sudhakar MuthuKrishnan

Private Sub DGV_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DGV_TimeSheetMain.EditingControlShowing
    '       '*************Allow only Numbers in DataGridView*************
    Dim txtEdit As TextBox = e.Control
    'remove any existing handler
    RemoveHandler txtEdit.KeyPress, AddressOf TextEdit_Keypress
    AddHandler txtEdit.KeyPress, AddressOf TextEdit_Keypress
End Sub

Private Sub TextEdit_Keypress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
    'Test for numeric value or backspace in first column
    If DGV.CurrentCell.ColumnIndex = 1 Then
        If IsNumeric(e.KeyChar.ToString()) Or e.KeyChar = ChrW(Keys.Back) Then
            e.Handled = False 'if numeric display
        Else
            e.Handled = True  'if non numeric don't display
        End If
    End If
End Sub

回答by user5163722

Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As         System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
        AddHandler CType(e.Control, TextBox).KeyPress, AddressOf TextBox_keyPress
 End Sub
 Private Sub TextBox_keyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
        If Char.IsDigit(CChar(CStr(e.KeyChar))) = False Then e.Handled = True
        If Not (Char.IsDigit(CChar(CStr(e.KeyChar))) Or e.KeyChar = ".") Then e.Handled = True
        If e.KeyChar = " "c Then e.Handled = False
  End Sub