C# 单元格上的datagridview位置
通过使用事件 我有密码C# 单元格上的datagridview位置,c#,vb.net,datagridview,C#,Vb.net,Datagridview,通过使用事件 我有密码 Private Sub dgPredracunS_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgPredracunS.CellValueChanged _curRow= e.RowIndex _curCell= e.ColumnIndex If dgPredracunS.Columns(e.ColumnIndex).Nam
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
我想在该单元格上定位,以便用户可以输入新值。否则,它应该像现在一样通过datagrid。但主要原因是它不会聚焦于那个细胞
我知道事件验证,但由于某些原因,我无法执行此操作,因为此事件上有大量代码。使用
cellvalinging
事件,并用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
原来的帖子很难理解,但是从你对@jonathana的评论来看,答案是正确的 “这不是我问题的解决方案,主要原因是在datagrid上,我有5列可以通过datagrid进行编辑,所以im 在网格和编辑单元格中使用键箭头移动。主要原因是 如果我输入了无效值,它应该停止并再次关注该值 “细胞” 如果我理解正确,用户在更改前一单元格中的值后,将使用箭头键转到下一列。然而,这是可行的;你评论的主要原因可能比表面上看起来要复杂一些。您的评论: '主要原因是,如果输入无效值,它将停止并再次聚焦于该单元格' 要在用户按下箭头键、回车键、制表键或任何其他键后返回上一个单元格,可能是一个挑战。触发
CellValidating
或CellValueChanged
事件后,DataGridView
控件将移动到此新位置。因此,在不知道用户按下了什么“键”(右箭头、左箭头、向上箭头、、等)的情况下,可能很难确定“上一个”单元格的位置,因为DataGridView
控件不知道
一个可能的解决方案是按照上面的建议,从“Quant”列中的单元格中捕获按下的每个键。这种方法可能有些过分;但这将允许您捕获用户在更改单元格值时按下的键。如果用户试图在单元格中的值无效时使用箭头键,则可以弹出消息并忽略按下的箭头键。或者,不允许用户输入无效值。每次用户按下一个键时检查该值,如果该值超过10,则弹出一条消息并忽略按下的键
遵循jonathana的方法,添加一些错误检查,以捕获错误数字并忽略空白单元格。用户将无法在“Quant”列单元格中键入大于10的值并保留这些值。如果用户输入的值超过10并试图离开单元格,则会弹出一条消息,指示错误,然后简单地忽略(取消编辑)用户输入的内容,保留旧值,最后让DataGridView
控件移动到下一个单元格。如果用户输入字符(无效数字),那么很明显,字符串与整数值(10)的比较毫无意义,因此与以前一样…只需忽略用户输入,保留旧值,并允许DataGridView
控件移到下一个单元格。由于这允许添加新行,“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
嘿@jonathana这不是我问题的解决方案主要原因是在datagrid上我有5列可以通过datagrid编辑,所以我用键箭头移动网格和编辑单元格。主要原因是,如果我输入了无效值,它将停止并再次关注该单元格