如何遍历Windows窗体表单中的所有控件或如何查找特定控件是否是容器控件?

naw*_*fal 12 .net c# winforms

我会告诉我的要求.我需要keydownWindows窗体表单中为每个控件创建一个事件.如果我必须为所有keydown事件做的事情是相同的,那么最好这样做而不是为所有控件手动执行它.

所以我基本上可以这样做:

foreach (Control c in this.Controls)
    c.KeyDown+= new KeyEventHandler(c_KeyDown);
Run Code Online (Sandbox Code Playgroud)

但是在这里,foreach不会循环驻留在groupBox或tabControl中的那些控件.我的意思是如果表单(this)包含groupBox或其他一些容器控件,那么我可以获得该特定容器控件的keydown事件.并且foreach不会循环遍历该容器控件内的控件.

问题1:如何为表单中的"所有"控件获取keydown事件?

如果上面的谜题得到解决,那么我的问题就结束了.

这是我可以做的事情:

主要是伪代码

foreach (Control c in this.Controls)
{
     c.KeyDown += new KeyEventHandler(c_KeyDown);

     if (c is Container control)
           FunctionWhichGeneratesKeyDownForAllItsChildControls(c)
}
Run Code Online (Sandbox Code Playgroud)

我知道FunctionWhichGeneratesKeyDownForAllItsChildControls(c)如果组合框中有组框,我将不得不经历多次以获得所有控件的keydown.我能做到.我的问题是,

问题2:如何检查是否c是容器控件?

Mag*_*nus 18

一个简单的递归函数应该这样做.

private void AddEvent(Control parentCtrl)
{
  foreach (Control c in parentCtrl.Controls)
  {
    c.KeyDown += new KeyEventHandler(c_KeyDown);
    AddEvent(c);
  }
}
Run Code Online (Sandbox Code Playgroud)