Control Validating und DialogResult Interaktion

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Control Validating und DialogResult Interaktion

    Hallo,

    ich habe jetzt ein wenig länger herumgebastelt um einen Dialog auf eine bestimmte Weise zu schließen. Es funktioniert, aber dabei ist mir eine Mechanik nicht ganz klar.

    Mit Enter schließt der Dialog (AcceptButton und DialogResult festgelegt), wenn alle Controls korrekt ausgefüllt sind, sonst meckert das letzte Control aus dem Validating Event heraus.

    Wenn der Button disabled ist passiert bei Enter nichts, da wird kein Control verlassen oder validiert. Wenn der Button enabled ist passiert jedoch genau das.
    Wie verlässt Enter ein Control in diesem Fall? Da muss ja irgendein Event laufen vor dem Validating des letzten Controls, das aber an die Aktivität des Button geknüpft ist.
    Danach läuft aber erst das Click Event des Buttons, was gleichzeitig bedeutet, dass jenes andere Event noch nichts mit dem Schließen des Dialogs zu tun hat, sonst würde ja gar kein Click mehr kommen.


    Anders gefragt, warum weiß die Textbox wann der Button aktiv ist und wann nicht?

    Viele Grüße

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Haudruferzappeltnoch schrieb:

    Wie verlässt Enter ein Control in diesem Fall? Da muss ja irgendein Event laufen vor dem Validating des letzten Controls, das aber an die Aktivität des Button geknüpft ist.
    Geht es Dir letztenendes um die Frage, wie der mittels AcceptButton festgelegte Button mitbekommt, dass Enter gedrückt wurde, obwohl er nicht selektiert ist? Weil: Das ganze Validierungszeugsl ist ja nur erstmal in Deinem Projekt aktiv.

    Mittels Eventlogging des Buttons konnte ich sehen, dass nur das Click-Event ausgelöst wurde, sobald man in einer OneLine-TextBox Enter drückt. Das Form selbst feuert anscheinend keine zusätzlichen Events. Das ging vom letzten Paint direkt ins Closing-Event über.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    @Haudruferzappeltnoch Wenn Du es etwas einfacher gestalten willst, gehe ins FormClosing-Event.
    Wenn DialogResult = Cancel, tue nichts.
    Ansonsten überprüfe der Reihe nach Deine Controls,
    setze bei einem Fehler einen Fokus drauf und setze e.Cancel = True.
    Wenn Du es ganz professionell machen willst, überwachst Du auch e.CloseReason und gehst raus, wenn z.B. das Betriebssystem runterfahren will:
    learn.microsoft.com/de-de/dotn…n?view=windowsdesktop-7.0
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Na mit dem Validating kann ich den Dialog ja trotzdem noch canceln, das will ich ja auch garnicht verhindern.

    @VaporiZed
    Ich bin nicht sicher, ob es mir darum geht. Ich denke eher es hat mit der TextBox zutun.
    Fall 1: Button generell inaktiv, ich kann in der Textbox Enter drücken und nichts passiert. Ist ja auch richtig.
    Wenn der Button aktiv ist, dann löst Enter allerdings das Validating Event der Textbox aus. Aber dazu müsste ja die Textbox verlassen werden, das passiert aber ja nicht wie Fall 1 zeigt.
    Du schreibst Enter löst mehrere Events aus, wo kommt das denn her, muss da nicht irgendein Event sein, das sagt "Click Button" und "Close Form"?
    Durch ein Stop im Button.Click-EventHandler können wir uns die Aufrufliste anschauen. Da wird klar, dass die ProcessDialogKey-Methoden von TextBox und Form die Quelle sind. Das Form führt dabei die Methode PerformClick des als AcceptButton festgelegten Buttons aus.

    Quellcode für das Form (zugänglich über F12, nachdem man Me.ProcessDialogKey geschrieben und den Methodennamen angewählt hat):
    Spoiler anzeigen

    C#-Quellcode

    1. //
    2. // Zusammenfassung:
    3. // Verarbeitet eine Tastatureingabe im Dialogfeld.
    4. //
    5. // Parameter:
    6. // keyData:
    7. // Einer der System.Windows.Forms.Keys-Werte, die die zu verarbeitende Taste darstellen.
    8. //
    9. // Rückgabewerte:
    10. // true, wenn der Tastaturanschlag verarbeitet und auf das Steuerelement angewendet
    11. // wurde, andernfalls false, um eine weitere Verarbeitung zu ermöglichen.
    12. [UIPermission(SecurityAction.LinkDemand, Window = UIPermissionWindow.AllWindows)]
    13. protected override bool ProcessDialogKey(Keys keyData)
    14. {
    15. if ((keyData & (Keys.Control | Keys.Alt)) == 0)
    16. {
    17. switch (keyData & Keys.KeyCode)
    18. {
    19. case Keys.Return:
    20. {
    21. IButtonControl buttonControl = (IButtonControl)base.Properties.GetObject(PropDefaultButton);
    22. if (buttonControl != null)
    23. {
    24. if (buttonControl is Control)
    25. {
    26. buttonControl.PerformClick();
    27. }
    28. return true;
    29. }
    30. break;
    31. }
    32. case Keys.Escape:
    33. {
    34. IButtonControl buttonControl = (IButtonControl)base.Properties.GetObject(PropCancelButton);
    35. if (buttonControl != null)
    36. {
    37. buttonControl.PerformClick();
    38. return true;
    39. }
    40. break;
    41. }
    42. }
    43. }
    44. return base.ProcessDialogKey(keyData);
    45. }

    Bilder
    • Aufrufliste.png

      12,24 kB, 1.292×230, 32 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    1. Teil: Ja.
    2. Teil: Nachdem ich Enter drückte, während der Fokus in der TextBox war, folgte

    Quellcode

    1. TextBox1 löste das Event »PreviewKeyDown« aus.
    2. TextBox1 löste das Event »Validating« aus.
    3. TextBox1 löste das Event »Validated« aus.
    4. Button1 löste das Event »Invalidated« aus.
    5. Form2 löste das Event »Paint« aus.
    6. Button1 löste das Event »Paint« aus.
    7. Button1 löste das Event »Click« aus.
    Der Eingabefokus wird also nicht verschoben. Was dann allerdings von PreviewKeyDown zu Validating führt, konnte ich (noch) nicht rausfinden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.