datagridview在单元格上的位置

时间:2017-06-28 18:20:11

标签: 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).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

我想在该单元格上定位,以便用户可以输入新值。否则它应该在数据网格中移动,因为它现在正常工作。但主要原因是它不会专注于那个细胞。

我知道事件验证但由于某种原因我不能这样做,因为这个事件有更多的代码。

2 个答案:

答案 0 :(得分:1)

原帖很难理解,但是从你对@jonathana正确回答的评论......

  

“这不是解决我的问题的主要原因是在datagrid上我有5列可以通过数据网格进行编辑所以即时通讯   用关键箭头移动网格和编辑单元格。主要原因   如果我输入无效值,它应该停止并再次关注它   细胞”

如果我理解正确,用户在更改上一个单元格中的值后,使用箭头键转到下一列。然而,这是可行的;你评论的主要原因可能比它看起来要复杂一些。你的评论:

  

'主要原因是如果我输入无效值,它应该停止并再次关注该单元格“

要在用户按下箭头键后返回上一个单元格,输入键,Tab键或任何其他键可能是一个挑战。在DataGridViewCellValidating事件被触发后,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