DataGridView Numeric Only Cell?

前端 未结 8 590
广开言路
广开言路 2021-01-06 07:33

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

相关标签:
8条回答
  • 2021-01-06 07:40

    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_keyPress1 Event for numeric with decimal value

    0 讨论(0)
  • 2021-01-06 07:43
    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
    
    0 讨论(0)
  • 2021-01-06 07:47

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

    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
    
    0 讨论(0)
  • 2021-01-06 07:50
    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
    
    0 讨论(0)
  • 2021-01-06 07:50

    Try This with lambda

    Private Sub dgv_pararelhp_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgv_pararelhp.EditingControlShowing
        If dgv_pararelhp.CurrentCell.ColumnIndex = 0 Then'// change this optional your index column.
             AddHandler CType(e.Control, TextBox).KeyPress, Sub(s_, e_)
                                                                If Char.IsDigit(CChar(CStr(e_.KeyChar))) = False Then e_.Handled = True
                                                             End Sub
           End If
    End Sub
    
    0 讨论(0)
  • 2021-01-06 07:57

    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.

    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
    
    0 讨论(0)
提交回复
热议问题