我会说出我的要求。我需要为 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/