我来说明我的需求。我需要为 Windows Forms 表单中的每个控件都添加一个 keydown
事件。如果我必须对所有的 keydown 事件执行相同的操作,那么最好这样做,而不是手动为所有控件添加事件。
所以,基本上我可以这样做:
foreach (Control c in this.Controls)
c.KeyDown+= new KeyEventHandler(c_KeyDown);
但是问题在于,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)
}
我知道如果有嵌套的groupbox,我需要多次使用FunctionWhichGeneratesKeyDownForAllItsChildControls(c)
来获取所有控件的keydown事件。我可以做到这一点。我的问题是,
问题2:如何检查c
是否为容器控件?
Controls.Count>0
的控件,因此没有必要显式地检查它,因为如果Controls.Count==0
,则在Controls
上的foreach循环不执行任何操作。 - Doc BrownKeyPreview
属性,它可以让你集中处理键盘事件。详见:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.form.keypreview.aspx - Ben Voigt