通过使用该事件 我有代码
Private Sub dgPredracunS_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgPredracunS.CellValueChanged
_curRow= e.RowIndex
_curCell= e.ColumnIndex
If dgPredracunS.Columns(e.ColumnIndex).Name = "Quant" Then
If dgPredracunS.Rows(e.RowIndex).Cells("Quant").Value > 10 Then
MsgBox("Enter new value")
dgPredracunS.CurrentCell = dgPredracunS(_curRow, _curCell)
End if
End if
End Sub
我想在该单元格上定位,以便用户可以输入新值。否则它应该在数据网格中移动,因为它现在正常工作。但主要原因是它不会专注于那个细胞。
我知道事件验证但由于某种原因我不能这样做,因为这个事件有更多的代码。
答案 0 :(得分:1)
原帖很难理解,但是从你对@jonathana正确回答的评论......
“这不是解决我的问题的主要原因是在datagrid上我有5列可以通过数据网格进行编辑所以即时通讯 用关键箭头移动网格和编辑单元格。主要原因 如果我输入无效值,它应该停止并再次关注它 细胞”
如果我理解正确,用户在更改上一个单元格中的值后,使用箭头键转到下一列。然而,这是可行的;你评论的主要原因可能比它看起来要复杂一些。你的评论:
'主要原因是如果我输入无效值,它应该停止并再次关注该单元格“
要在用户按下箭头键后返回上一个单元格,输入键,Tab键或任何其他键可能是一个挑战。在DataGridView
或CellValidating
事件被触发后,CellValueChanged
控件将移至此新位置。因此,在不知道用户按下了什么“键”(右箭头,左箭头,向上箭头等)的情况下,找出“先前”单元格位置是什么可能是一个挑战,因为DataGridView
控件没有不知道。
一种可能的解决方案是按照上面的建议进行操作,并捕获从“Quant”列中的单元格按下的每个键。这种做法可能有点过分;但这样可以捕获用户在更改单元格值时按下的键。如果用户在单元格中的值无效时尝试使用箭头键,则可以弹出消息并忽略按下的箭头键。或者,不允许用户输入无效值。每次用户按键时检查值,如果值超过10,则弹出一条消息并忽略按下的键。
遵循jonathana的方法,添加一些错误检查以捕获错误的数字并忽略空白单元格。用户将无法在“Quant”列单元格中键入大于10的值并保留它们。如果用户输入的值超过10并尝试离开单元格,则会弹出一条消息,指示错误,然后忽略(CancelEdit)用户输入的内容,保留旧值并最终让DataGridView
控件移动到下一个细胞。如果用户输入字符(无效数字),那么显然是字符串比较,对整数值(10)没有意义,因此像以前一样......只需忽略用户输入,保留旧值并允许DatagridGridView
控件继续前进到下一个细胞。由于这允许添加新行,因此“Quant”单元可能为空并且没有值。因此,允许空白值。希望这会有所帮助。
Private Sub dgPredracunS_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles dgPredracunS.CellValidating
Dim newValue As Integer
Dim oldValue As String
If dgPredracunS.Rows(e.RowIndex).IsNewRow Then Return
If (Not (dgPredracunS.Columns(e.ColumnIndex).Name = "Quant")) Then Return
If (dgPredracunS.Rows(e.RowIndex).Cells("Quant").Value IsNot Nothing) Then
oldValue = dgPredracunS.Rows(e.RowIndex).Cells("Quant").Value
Else
oldValue = ""
End If
If (Int32.TryParse(e.FormattedValue.ToString(), newValue)) Then
If newValue > 10 Then
PrintErrorMessage("Can not be greater than 10: ", newValue.ToString(), oldValue, e.RowIndex, e.ColumnIndex)
End If
Else
If Not e.FormattedValue = "" Then
PrintErrorMessage("Not a valid number: ", e.FormattedValue, oldValue, e.RowIndex, e.ColumnIndex)
End If
End If
End Sub
Private Sub PrintErrorMessage(message As String, newValue As String, oldValue As String, row As Int32, col As Int32)
MsgBox(message + newValue + " in cell row: " + row.ToString() + " Col: " + col.ToString() + Environment.NewLine() +
"... Using old value: " + oldValue)
dgPredracunS.CancelEdit()
End Sub
答案 1 :(得分:0)
使用CellValidating
事件并使用ErrorText
属性提示用户:
Private Sub dgPredracunS_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles dgPredracunS.CellValidating
If dgPredracunS.Rows(e.RowIndex).IsNewRow Then Return
If dgPredracunS.Columns(e.ColumnIndex).Name = "Quant" Then
Me.dgPredracunS.Rows(e.RowIndex).ErrorText = ""
If CType(e.FormattedValue.ToString(), Integer) > 10 Then
e.Cancel = True
Me.dgPredracunS.Rows(e.RowIndex).ErrorText = "the value is not valid"
End If
End If
End Sub