以下代码是 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