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