Key Events funktionieren nicht in einem Programm mit MDI Childs

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

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von DerSmurf.

    Key Events funktionieren nicht in einem Programm mit MDI Childs

    Hallo ihr lieben
    In diesem Thread wird mir wunderbar geholfen ein Programm mit "sauberem" Code - mein erstes in dieser Form - zu erstellen.
    Jedoch tritt hier ein Problem auf, für das sich innerhalb des Threads keine Lösung findet. Deswegen versuche ich mal dieses Problem als separaten Post anzugehen.

    Die frmFinishOrder hat ein KeyDown und auch ein KeyPress Event (und KeyUp habe ich natürlich auch probiert).
    Diese Events werden jedoch nicht gefeuert.
    Wenn ich die Form nicht als MDIChild aufrufe - also mittels .showdialog - dann funktioniert das Event.
    Es liegt also an der MDI Geschichte, dass es nicht funktioniert.

    Hat hier eventuell jemand eine Idee zu?
    Dateien
    Ok, also grundsätzlich ist das Problem, das frmMain die Eingaben auf Wunsch erhält. Aber niemals das MDIChild. Dementsprechend müsstest Du wohl die Eingaben über frmMain laufen lassen und diese dann MDIChild-abhängig auswerten.
    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.
    Du bist ein Traum. Das hier scheint zu funktionieren:

    VB.NET-Quellcode

    1. Private Sub frmMain_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    2. If Me.ActiveMdiChild.Name = frmFinishOrder.Name Then MessageBox.Show("keydown")
    3. End Sub


    Nun möchte ich, damit das Event auch einen Sinn hat z.B. die Textbox frmKunden.tbCustomerSearch damit beschreiben.
    Also mein fertiges Konstrukt für das KeyPress Event sieht jetzt so aus:

    VB.NET-Quellcode

    1. Private Sub frmMain_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Me.KeyPress
    2. Select Case Me.ActiveMdiChild.Name
    3. Case = frmFinishOrder.Name
    4. 'mach was auf frmFinishOrder
    5. Case = frmKunden.Name
    6. If Not frmKunden.tbCustomerSearch.Focused Then frmKunden.tbCustomerSearch.AppendText(e.KeyChar)
    7. End Select
    8. End Sub

    das passt so, oder?
    Ja, z.B.; wobei ich allerdings eher vom String-Vergleich weg zum Instanzvergleich hingehen würde, aber das ist ein Detail:

    VB.NET-Quellcode

    1. Select Case True
    2. Case Me.ActiveMdiChild Is frmFinishOrder
    3. 'mach was auf frmFinishOrder
    4. Case Me.ActiveMdiChild Is frmKunden
    5. If Not frmKunden.tbCustomerSearch.Focused Then frmKunden.tbCustomerSearch.AppendText(e.KeyChar)
    6. End Select
    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.
    @DerSmurf Ich starte Dein Programm und klicke die Sicherheitswarnung weg.
    Ich drücke auf neu und befülle die TextBoxen mit "Roulade mit Klößen", indem ich mit Tab weiterspringe.
    Im Feld PLZ ist schluss, da hilft kein Tab, kein Umsetzen des Eingabecursors mit der Maus.
    Erst, wenn bei PLZ (mindestens) eine Ziffer drinne steht, komme ich weiter.
    Sehr merkwürden:
    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!
    @VaporiZed
    So hab ich es zuerst versucht, weil ich die ActiveMdiChild Eigenschaft im Objektkatalog gefunden habe. Allerdings habe ich statt mit "Is" Operator mit "=" gearbeitet, also hats nicht funktioniert.
    Aber das ändere ich natürlich noch.

    @RodFromGermany
    Das liegt an den Helpers vom @ErfinderDesRades.
    Erst wenn ich der Textbox ein gültiger Wert (in dem Fall int32) enthalten ist, kann die TB verlassen werden.
    Warum man was anderes überhaupt reinschreiben kann, verstehe ich auch nicht - aber ich nehm das einfach so hin.