2009-08-23 10 views

Odpowiedz

15

Coś wzdłuż linii:

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

Działa idealnie. Dziękuję Ci! Krótka notatka dla innych osób: foreach (kontrola kontrolna w this.Controls) nie zawiera wszystkich formantów - możesz mieć kontenery (np. System.windows.forms.panel) w formularzu. –

+0

Nie pomyślałbym o tym, ale to wydaje się całkowicie działać. (Moim celem było warunkowe wyłączenie Enter, ale ten sam pomysł.) Dzięki! – neminem

1

Należy ustawić KeyPreview true na formularzu. Obsługuj zdarzenie KeyDown/KeyUp/KeyPress i ustaw e.Handled w module obsługi zdarzeń na wartość true dla kluczy, które mają zostać zignorowane.

+0

To podejście nie wydaje się działać, nie ma e.Handled na PreviewKeyDownEventArgs – andynormancx

+0

e.Handled istnieje, ale w sposób: private void Form1_KeyUp (object sender, KeyEventArgs e), KeyDown itp mam problemy z takim podejściem też. Spróbuję tego na czystym projekcie. –

+0

Tak, istnieje w zdarzeniu KeyDown, ale ustawienie go nie pomaga, nawigacja już się odbyła w tym punkcie. – andynormancx

2

ja skończyło się z kodem poniżej której ustawić funkcję do każdej kontroli na formularzu:

(Kod jest oparty na jednej z andynormancx)



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; 
    } 
} 
1

Próbowałem tego aproach, gdzie formularz obsługuje zdarzenie podglądu jeden raz. Generuje mniej kodu niż pozostałe opcje.

Po prostu dodaj tę metodę do zdarzenia PreviewKeyDown w formularzu i ustaw właściwość KeyPreview na 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

Witam carlos. Chciałem użyć waszej krótszej wersji, ale kiedy ją przetestowałem, nie zrobiło to, co powinno niestety ... (i pamiętałem oczywiście, żeby ustawić "Form.KeyPreview = true"). Dopiero kiedy dodałem foreach() w Form_Load, zachowanie zmieniło się. Czy testowałeś to? – spaceman

Powiązane problemy