【问题标题】:VB.NET 2010 DataGridView Handling Keypress via EditingControlShowing EventVB.NET 2010 DataGridView 通过 EditingControlShowing 事件处理按键
【发布时间】:2015-07-01 21:33:28
【问题描述】:

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

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

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

基本上在此活动期间,我无法看到输入时单元格的值“将是”。

我尝试添加“.RefreshEdit”和“.Commit”,但它们不起作用。

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

【问题讨论】:

    标签: vb.net winforms datagridview vb.net-2010


    【解决方案1】:

    你找错地方了。您需要检查 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
    

    【讨论】:

    • 在 TextChanged 事件中,控制文本,如果它包含非数字数字,则删除它们并且不发送“Tab”。这可能是剪切和粘贴操作的结果。备注:不发送 TAB 键,而是更改 DataGridView.CurrentCell。
    • @Graffito 当然还有其他方法可以做到这一点,但我不确定您所说的Tab may result in a cut and paste action 是什么意思。怎么会这样?当代码运行时,光标在文本框中。
    • 假设编辑单元格的初始值为“12”,如果从某处剪切字符串“ABC”,选择整个单元格内容并粘贴“ABC”,将触发TextChanged事件。在这种情况下,“ABC”不是有效的单元格值,您不应移动到下一个单元格。
    • 拉斯,谢谢。这非常接近....我发现的一个问题是,如果当我鼠标/制表符等时单元格中已经有 2 个字符,那么似乎就像我开始输入一样,看起来它正在检测到 2 个字符已经存在并且正在触发 TAB。我正在调试它以查看正在触发的事件....
    • 涂鸦,在我的情况下这不是问题,因为 MaxLength 已设置...所以即使您粘贴 123...只有 12 会粘贴。
    猜你喜欢
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多