.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
DataGridView Numeric Only Cell?
提问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

