Winforms 如何在自定义容器控件中激发KeyDown事件?

Winforms 如何在自定义容器控件中激发KeyDown事件?,winforms,keydown,Winforms,Keydown,我有一个自定义容器控件(源自FlowLayoutPanel),其中包含零个或多个由用户拖动到那里的子控件。单击子控件时,它将被“选中”。(它使用彩色边框绘制,并且可以使用选项更改其属性。) 我希望处理Delete键,这样,如果用户当前正在容器控件中工作(例如,在控件内或子控件上单击),则删除当前选择的控件(如果有) 我已经在子项上使用右键单击上下文菜单实现了删除功能。我的问题是处理Delete键。我不知道如何使KeyDown事件在容器控件内引发。我知道它与焦点有关,因此必须调用Control.S

我有一个自定义容器控件(源自
FlowLayoutPanel
),其中包含零个或多个由用户拖动到那里的子控件。单击子控件时,它将被“选中”。(它使用彩色边框绘制,并且可以使用选项更改其属性。)

我希望处理
Delete
键,这样,如果用户当前正在容器控件中工作(例如,在控件内或子控件上单击),则删除当前选择的控件(如果有)

我已经在子项上使用右键单击上下文菜单实现了删除功能。我的问题是处理
Delete
键。我不知道如何使KeyDown事件在容器控件内引发。我知道它与焦点有关,因此必须调用
Control.Select()
(或其等效项),但最好的方法是什么?这个焦点逻辑在哪里?还是有更好的办法

我不想在表单中处理
KeyDown
事件,然后嗅出焦点在哪里。这是一个可重用的容器控件,我希望逻辑驻留在那里

要在自定义控件上触发
按键
事件,我必须做什么

public class MyContainer : FlowLayoutPanel
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Delete)
        {
            MessageBox.Show("How do I get here?");
            e.Handled = true;
        }

        base.OnKeyDown(e);
    }
}

拖到容器中的项目是否可能正在接收事件


可能在将项目放入容器后,您需要手动将焦点设置为容器。

对于MSDN上的FlowLayoutPanel控件,KeyDown事件被列为无意义。建议将该活动作为备选方案。

谢谢您的建议。在我的场景中,PreviewKeyDown事件也没有触发。当我继续玩它的时候,我意识到我上面的问题可能太简单了。我的容器控件托管在UserControl中,这似乎使生活更加复杂。感谢您的回复。这让我找到了解决办法。子控件也无法接收焦点,因此在我的整个控件继承权范围内,任何东西都无法说“嘿!我现在有焦点了!”。我刚刚在我的子控件的OnMouseDown方法重写中执行了一个Control.Select()。然后我就可以处理OnKeyDown事件了。如果我必须在容器中处理它,我可以按照您的建议执行或重写ProcessKeyPreview方法,后者看起来很痛苦。:)