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
我是第一次使用 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