VB.NET 2010 DataGridView 通过 EditingControlShowing 事件处理按键

VB.NET 2010 DataGridView Handling Keypress via EditingControlShowing Event

我是第一次使用 DataGridView,虽然我有很多问题,但最新一期让我很烦恼。

问题摘要: 我有一个 DataGridView (dgv),我定义了一组列。有些只读有些可编辑。
对于可编辑的列,我需要发生四件事。
1) 允许输入数字
2) 最多允许 2 位数字
3) 零填充任何条目<2 digits

4) 我的问题:
如果用户输入一个两位数字,我想检测它并按 TAB 键转到下一列。我无法让它工作。

示例代码(省略了一些已知的工作项目):

Private Sub dgvDiary_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvDiary.EditingControlShowing
    Dim txtEdit As TextBox = e.Control
    txtEdit.MaxLength = 2

    'remove any existing handler
    RemoveHandler txtEdit.KeyPress, AddressOf txtdgvDiaryEdit_Keypress
    AddHandler txtEdit.KeyPress, AddressOf txtdgvDiaryEdit_Keypress
End Sub

Private Sub txtdgvDiaryEdit_Keypress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
    'Test for numeric value or backspace 
    If IsNumeric(e.KeyChar.ToString()) _
    Or e.KeyChar = ChrW(Keys.Back) Then
        e.Handled = False 'if numeric  
    Else
        e.Handled = True  'if non numeric 
    End If

    'If user typed in 2 characters, move on!
    'Don't work!
    If Strings.Len(Me.dgvDiary.Rows(Me.dgvDiary.CurrentRow.Index).Cells(Me.dgvDiary.CurrentCell.ColumnIndex).Value) = 2 Then
        SendKeys.Send("{TAB}")
    End If
End Sub

基本上在这次活动中,我无法看到输入时单元格 "will be" 的值。

我尝试添加“.RefreshEdit”和“.Commit”,但它们没有用。

有什么方法可以测试此事件中的代码,或者是否有我可以使用的会在之后立即触发的事件?

你找错地方了。您需要检查 TextBox 中的文本,而不是网格中的文本,以查看当前键入的字符数。为此尝试使用 TextChanged 事件:

Private Sub txtdgvDiaryEdit_TextChanged(sender As Object, e As EventArgs)
  If DirectCast(sender, TextBox).Text.Length = 2 Then
    SendKeys.Send("{TAB}")
  End If
End Sub

像您的其他代码一样,添加处理程序:

'remove any existing handler
RemoveHandler txtEdit.TextChanged, AddressOf txtdgvDiaryEdit_TextChanged
AddHandler txtEdit.TextChanged, AddressOf txtdgvDiaryEdit_TextChanged
RemoveHandler txtEdit.KeyPress, AddressOf txtdgvDiaryEdit_KeyPress
AddHandler txtEdit.KeyPress, AddressOf txtdgvDiaryEdit_KeyPress

或者,您可以检查 TextBox 是否只有一个字符,如果 KeyPress 正在传递另一个数字,然后发送您的 Tab 键。在这种情况下,您将删除 TextChanged 事件代码:

Private Sub txtdgvDiaryEdit_KeyPress(sender As Object, e As KeyPressEventArgs)
  'Test for numeric value or backspace 
  If IsNumeric(e.KeyChar.ToString()) _
  Or e.KeyChar = ChrW(Keys.Back) Then
    e.Handled = False 'if numeric  
  Else
    e.Handled = True  'if non numeric 
  End If

  If DirectCast(sender, TextBox).Text.Length = 1 AndAlso Char.IsNumber(e.KeyChar) Then
    SendKeys.Send("{TAB}")
  End If
End Sub