Control auslesen?

  • VB.NET
  • .NET (FX) 4.0

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Control auslesen?

    Hallo,

    ich hab' mir ein Handling für Dialoge gebaut und muss darin u.a. auch das Control auslesen, aus dem der Keydown kam.
    Wenn es eine Combobox ist, dann soll Keys.Down und Keys.Up kein Tab bzw. BackTab senden.

    Bei Zeile 11 kommt immer Nothing - was mach' ich hier falsch?

    LG

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Public Module frmHandling
    3. ''' <summary> übernimmt das Key-Handling eines Dialogs </summary>
    4. <Extension>
    5. Public Sub RegisterDlgKeyHandler(dlg As Form)
    6. AddHandler dlg.KeyDown, AddressOf dlg_KeyDown
    7. End Sub
    8. Private Sub dlg_KeyDown(sender As Object, e As KeyEventArgs)
    9. Dim dlg = DirectCast(sender, Form)
    10. Dim ctl = TryCast(sender, ComboBox)
    11. Select Case e.KeyCode
    12. Case Keys.Enter : sendTab()
    13. Case Keys.F6 : dlg.DialogResult = DialogResult.OK
    14. Case Keys.Down : If Not ctl.NotNull Then sendTab()
    15. Case Keys.Up : If Not ctl.NotNull Then backTab()
    16. End Select
    17. End Sub
    18. End Module
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Du registrierst das KeyDown-Event für ein Form. Und dann erwartest Du, dass der sender (= das Form) in Z#11 in eine ComboBox umwandelbar ist. Du erkennst den Fehler?
    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.
    @tragl Wieso befindet sich der KeyDown-Handler in einem Modul und nicht in der Form :?:
    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!
    @RodFromGermany
    Weil ich das für viele meiner Dialoge benutzen und nicht jedesmal in die Form schreiben möchte ;)
    So brauch' ich auf der Form nur noch Me.RegisterDlgKeyHandler in das Load-Event hauen und läuft.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    @tragl Dann gib Deinen vielen Dialogen eine gemeinsame Basisklasse.
    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!
    Ich find das eiglich ganz schön, wie das wiederverwendbar ausgelagert ist.
    Es folgt dem "Behavior-Pattern", und dieser wiederum folgt dem Prinzip Composition over inheritance - stellt also durchaus eine Best-Practice dar, wies gemacht ist.

    Ich hätte noch eine Anmerkung zu

    VB.NET-Quellcode

    1. Case Keys.Down : If Not ctl.NotNull Then sendTab()
    Doppelte Verneinungen machen Code unnötig unleserlich - besser:

    VB.NET-Quellcode

    1. Case Keys.Down : If ctl.Null Then sendTab()
    Ich bezweifel aber, dass das überhaupt das ist, was du erreichen möchtest



    Zum eigentlichen Problem weiss ich keine einfache Lösung. Wie gesagt: das Form_KeyDown weiss natürlich nicht, welches Unter-Control den Tastendruck empfangen hat - sowas gibts erst inne WPF, dass die Events diese Info mitliefern täten.
    Ansonsten hab ich ja immer eine ControlStyling-Klasse mit am Start, die scant alle aufsitzenden Controls des übergebenen Forms - da könnte man Comboboxen identifizieren, und individuelle Handler anhängen.
    Ich weiss allerdings nicht, ob in deiner Solution sone ControlStyling-Klasse mit bei ist, ansonsten such mal nach meim Stechuhr-Projekt hier auf VBP - da ist sie bestimmt mit drin.

    ErfinderDesRades schrieb:

    Ich weiss allerdings nicht, ob in deiner Solution sone ControlStyling-Klasse mit bei ist

    Ja, die hab' ich drinne - aber ich wollte damit nicht auch noch in den Dialog grätschen, ist jetzt kein Beinbruch dass die Comboboxen auch auf Up und Down reagieren - dachte nur es
    wär irgendwie machbar das über den Weg abzufangen. ;)
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Ich hab's im Übrigen hinbekommen, das Control auszulesen (Zeile 3):

    VB.NET-Quellcode

    1. Private Sub dlg_KeyDown(sender As Object, e As KeyEventArgs)
    2. Dim dlg = DirectCast(sender, Form)
    3. Dim ctl = TryCast(dlg.ActiveControl, ComboBox)
    4. Select Case e.KeyCode
    5. Case Keys.Enter : sendTab()
    6. Case Keys.F6 : dlg.DialogResult = DialogResult.OK
    7. Case Keys.Down : If Not ctl.NotNull Then sendTab()
    8. Case Keys.Up : If Not ctl.NotNull Then backTab()
    9. End Select
    10. End Sub


    Ist damit also erledigt :D
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup: