Thomas Woelfers Baustatik Blog

Baustatik-Software und was sonst des Weges kommt

OnKeyDown() - geht nicht immer so wie erwartet

Ich bin sicherlich nicht der einzige der gerne hätte, das die selbst programmierten Dialogboxen geschlossen werden, wenn die Dialogbox gerade Focus hat und Escape gedrückt wird: Das ist das Verhalten, was jedermann bei einer Dialogbox erwarten würde.

Windows.Forms hat dafür Eventhandler, in denen man sich ums schließen kümmern kann: Dabei gibt es drei Handler, von denen der fürs KeyDown-Event der 'offensichtliche' ist. Nur wird der leider nie aufgerufen - und kann daher für den geschilderten Fall auch nicht verwendet werden.

Der KeyDown Event tritt nämlich ein nachdem eine Taste gedrückt wurde und zwar beim Control das gerade Fokus hat.

Die Form sieht dieses Event also NIE. (Bin gerne bereit mich belehren zu lassen, denn vielleicht gibt es schon einen Fall bei dem das Event eintritt, im Normalfall tut es das jedenfalls nicht. Es wäre natürlich schön, wenn das in der Dokumentation irgendwo stehen würden. :-( ) Mit anderen Worten: Um eine Dialogbox per ESC schließen zu können, ist KeyDown das falsche Ereignis.

Statt dessen macht man folgendes: Man überlädt ProcessDialogKey. Zum Beispiel so:

protected override bool ProcessDialogKey(Keys keyData)
{
   if (keyData == Keys
.Escape)
   {
      this
.Close();
      return true
;
   }
   return base
.ProcessDialogKey(keyData);
}

Noch kurz was anderes: Ich baue mitlerweile alle meine Testprojekte mit Visual C# 2005 Express (Beta). Bin wirklich begeistert.

Comments (1) -

  • kalme

    9/10/2004 9:21:49 PM |

    Hierzu gibt es auch einen anderen Ansatz, der wahrscheinlich der gängigere sein dürfte:

    Die Klasse System.Windows.Forms.Form kennt die beiden Eigenschaften AcceptButton und CancelButton. Für gewöhnlich hat jede Dialogbox ja einen Cancel-Button, der den Dialog direkt oder indirekt (z.B. über das DialogResult Cancel o.ä.) schließt.
    Wenn man nun einer Form in der CancelButton-Eigenschaft eine solche Schaltfläche zuweist, kann man den Dialog über Escape schließen (da beim Drücken von Escape automatisch die Schaltfläche hinter der Eigenschaft CancelButton betätigt wird).


    Zu dem generellen Problem:

    "Der KeyDown Event tritt nämlich ein nachdem eine Taste gedrückt wurde und zwar beim Control das gerade Fokus hat."

    Hierzu kennt die Form die Eigenschaft KeyPreview. Aus der Hilfe:

    "Gets or sets a value indicating whether the form will receive key events before the event is passed to the control that has focus."

    Viele Grüße,
    Kalme

Comments are closed