c# - 如何循环遍历 Windows 窗体窗体中的所有控件或如何查找特定控件是否为容器控件?

标签 c# .net winforms

我会说出我的要求。我需要为 Windows Forms 中的每个控件设置一个 keydown 事件形式。如果我必须对所有按键事件执行的操作相同,那么最好这样做而不是手动对所有控件执行此操作。

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

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

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

问题 1:如何获取表单中“所有”控件的按键事件?

如果上面的谜题都解决了,那么我的问题就结束了。

这是我可以做的其他事情:

主要是伪代码

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

     if (c is Container control)
           FunctionWhichGeneratesKeyDownForAllItsChildControls(c)
}

我知道我将不得不多次执行 FunctionWhichGeneratesKeyDownForAllItsChildControls(c) 以获取所有控件的 keydown,如果在 groupbox 中有 groupbox 左右的话。我能做到。我的问题是,

问题二:如何判断c是否为容器控件?

最佳答案

一个简单的递归函数就可以做到。

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

关于c# - 如何循环遍历 Windows 窗体窗体中的所有控件或如何查找特定控件是否为容器控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7545775/

相关文章:

c# - 编写重试逻辑的最简洁方法?

c# - 使用 asp.net mvc 计算相对日期

c# - 将 JSON 字符串解析为 .NET 对象

vb.net - Form.Load 事件未触发,表单显示

c# - 从表单控件 winform 播放和暂停视频

c# - 动态加载引用其他 DLL 的 DLL

c# - DataTemplate 中的 VisualBrush 不会重绘

c# - DataRow 中的 LINQ 结果

c# - 使用对象数组调用 Web 服务方法

c# - 当我的窗口的那部分被始终在顶部的窗口遮挡时,如何防止我的自定义工具提示代码绘制?