2009-08-23 79 views

回答

15

沿东西线)



private void Form1_Load(object sender, EventArgs e) 
{ 
    SetFeatureToAllControls(this.Controls);  
} 

private void SetFeatureToAllControls(Control.ControlCollection cc) 
{ 
    if (cc != null) 
    { 
     foreach (Control control in cc) 
     { 
      control.PreviewKeyDown += new PreviewKeyDownEventHandler(control_PreviewKeyDown); 
      SetFeatureToAllControls(control.Controls); 
     } 
    } 
} 

void control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right) 
    { 
     e.IsInputKey = true; 
    } 
} 
+0

完美的作品。谢谢! 其他人只需简短注释:foreach(this.Controls中的Control control)不包含所有控件 - 您可能在窗体上有容器(例如system.windows.forms.panel)。 – 2009-08-23 11:42:27

+0

想不到,但似乎完全有效。 (我的目标是有条件地禁用Enter,但同样的想法。)谢谢! – neminem 2013-08-28 23:40:51

1

您应该设置KeyPreview为true的形式。处理KeyDown/KeyUp/KeyPress事件,并将事件处理程序中的e.Handled设置为对于要忽略的键为true。

private void Form1_Load(object sender, EventArgs e) 
    { 
     foreach (Control control in this.Controls) 
     { 
      control.PreviewKeyDown += new PreviewKeyDownEventHandler(control_PreviewKeyDown); 
     } 
    } 

    void control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
    { 
     if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right) 
     { 
      e.IsInputKey = true; 
     } 
    } 
+0

这种做法似乎并不工作,没有e.Handled上 – andynormancx 2009-08-23 11:15:20

+0

e.Handled存在PreviewKeyDownEventArgs但在方法为:private void Form1_KeyUp(对象发件人,发送KeyEventArgs E)的KeyDown等我有问题也采用这种方法。我会在干净的项目上尝试一下。 – 2009-08-23 11:20:54

+0

是的,它存在于KeyDown事件中,但设置它没有帮助,导航已经发生在那个点上。 – andynormancx 2009-08-23 11:34:11

2

我已经结束了与下面的代码里面设置功能在表单中的每个控制:

(代码是基于一个从andynormancx

1

我试过这个问题,表单处理预览事件一次。它比其他选项生成的代码少。

只需将此方法添加到表单的PreviewKeyDown事件中,并将KeyPreview属性设置为true即可。

private void form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    switch (e.KeyCode) 
    { 
     case Keys.Up: 
     case Keys.Down: 
     case Keys.Left: 
     case Keys.Right: 
      e.IsInputKey = true; 
      break; 
     default: 
      break; 
    } 
} 
+0

嗨carlos。我想用你的较短的版本,但是当我测试它时,它不会做它应该不幸的事情(当然,我确实记得设置'Form.KeyPreview = true')。只有当我在Form_Load中添加foreach()时,行为才发生变化。你测试过了吗? – spaceman 2016-02-13 06:00:45