![](/img/trans.png)
[英]What's the best way of forcing a DataGridView Cell to accept numeric input only?
[英]DataGridView Numeric Only Cell?
我是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
試試這個代碼
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 事件僅用於數字
TextBox_keyPress1 十進制數值事件
如果只關心數據類型驗證,那么您可以像這樣使用 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;
}
}
}
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
以下代碼是 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
試試這個代碼。 它與投票最多的答案幾乎相同,但我編輯了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
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
用 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
我嘗試了 Sathish 的答案,但我不能使用退格,所以我嘗試了這個來代替按鍵事件
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 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.