【问题标题】:Send keyboard input to a specific child control将键盘输入发送到特定的子控件
【发布时间】:2014-05-17 19:48:17
【问题描述】:

好的,我会尽量保持快速和重点。

在 C# Winforms 中,我有一个显示数据网格视图和文本框的 GUI 窗口。基本上我想要做的是,当按下向上箭头键或向下箭头键时,将此输入直接发送到 datagridview 以便在列表中上下移动。如果按下任何其他键,我想将此输入发送到我的文本框。

我尝试过重写 ProcessCmdKey 方法并根据 keyData 键码设置焦点,但发生的情况是第一次按键只会设置控件焦点,然后,第二次按键实际上会在焦点控件上起作用.我希望输入立即生效,没有一键延迟。

额外细节:

GUI 类是一个通用类。

希望这是有道理的!如果需要更多详细信息,我将进行编辑 谢谢!

【问题讨论】:

  • 如果您添加您拥有和没有工作的代码,我们所有人都会更容易。
  • 我要添加代码,但它实际上只是一个 if 语句,例如 if(key == up or down) grid.focus();。我正在尝试一些简单的东西,希望它能起作用。

标签: c# .net winforms datagridview


【解决方案1】:

这很棘手,DataGridView 很难修补。它具有 ProcessUpKey() 和 ProcessDownKey() 方法,但它们受到保护。您必须重写该类并添加公共方法,以便您可以调用它们。您尝试执行的操作失败了,因为当您收到键盘消息时,它已经提交到具有焦点的窗口。

无需对现有表单进行重大更改即可工作的一些狡猾的hackorama 只是将键盘消息发回,但这次将DataGridView 作为目标窗口。将此 sn-p 粘贴到您的表单类中:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    if (msg.HWnd != dataGridView1.Handle && (keyData == Keys.Up || keyData == Keys.Down)) {
        PostMessage(dataGridView1.Handle, msg.Msg, msg.WParam, msg.LParam);
        return true;
    } 
    return base.ProcessCmdKey(ref msg, keyData);
}

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr PostMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);

【讨论】:

  • 很好的答案,非常感谢,效果很好!
猜你喜欢
  • 1970-01-01
  • 2015-06-08
  • 2021-12-25
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
相关资源
最近更新 更多