【问题标题】:KeyPress fires twice on Form when DataGridView focused当 DataGridView 聚焦时,KeyPress 在 Form 上触发两次
【发布时间】:2017-07-18 19:03:08
【问题描述】:

我想在表单级别读取 KeyPress 事件,但是当 DataGridView 控件具有焦点时遇到问题:第一个字符触发 Form KeyPress 事件两次。

下面是一小段代码:

Public Class Form1

    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Enable key preview.
        Me.KeyPreview = True

        ' Create list of elements.
        Dim elements As New List(Of TestStuff)({New TestStuff})

        ' Add datagrid.
        Dim dataGridView As New DataGridView
        Me.Controls.Add(dataGridView)
        dataGridView.Dock = DockStyle.Fill
        dataGridView.DataSource = elements
    End Sub

    Private Sub MainFormView_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress
        Console.WriteLine(String.Format("KeyPress {0} value: {1}", Now, CStr(e.KeyChar)))
    End Sub

End Class

Public Class TestStuff
    Public Property Stuff As String
End Class

注意:这只发生在网格中有元素时。

当我运行表单时,没有单击任何位置并输入字符,它会触发两次。例如,如果我输入数字“0”两次,我的事件日志显示:

KeyPress 7/18/2017 2:01:57 PM value: 0
KeyPress 7/18/2017 2:01:57 PM value: 0
KeyPress 7/18/2017 2:01:58 PM value: 0

第一次按键 0 触发两次。如何禁用或绕过此过程?

【问题讨论】:

  • 贴出的代码没有重复问题。每按一个键,我只会得到一个 KeyPress 日志。
  • 由于某种原因,当表单启用了 keypreview 并且事件是 Keydown 时,我在其他一些情况下也遇到了相同的行为。该事件连续触发两次。无法解释原因。
  • 是的,我在使用 KeyDown、KeyUp 甚至覆盖 ProcessCmdKey 时遇到了同样的问题

标签: vb.net winforms datagridview keypress


【解决方案1】:

显然这是一个已经存在一段时间的错误。 请查看https://social.msdn.microsoft.com/Forums/windowsapps/en-US/734d6c7a-8da2-48c6-9b3d-fa868b4dfb1d/c-textbox-keydown-triggered-twice-in-metro-applications?forum=winappswithcsharp&forum=winappswithcsharp

在你的 sub 末尾添加 e.Handled = true 应该可以解决问题

【讨论】:

  • 对于那些使用 VB6 体验过的人:将 KeyCode 设置为 0 与 e.Handled 的作用相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多