Focus auf Button behalten

  • VB.NET

Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von Noyne.

    Focus auf Button behalten

    Hi,

    ich habe eine Form, mit den folgenden Controls:

    zwei Textfelder: "Userid" und "Passwort"
    ein Button: "Enter"

    Ich möchte Userid und Passwort eingeben ... mit Enter erfolgt dann die Verarbeitung. Dazu will ich ganz einfach die "RETURN" Taste bzw. die "ENTER" Taste meines Keyboard drücken. Dadurch soll der Button "Enter" ausgelöst werden.

    Das Problem ist nun das Folgende: Beim Eingeben der Daten in die Felder "Userid" und "Passwort" erhalten diese den Focus. Und wenn man jetzt die "RETURN" Taste drückt, passiert natürlich nix! Man muss also entweder mit TAB auf den Button positionieren oder mit der Maus Taste den Button anklicken.

    Bei professionellen Dialogen ist das nicht notwendig. Wie kann ich denn erreichen, dass beim Drücken der RETURN bzw. ENTER Taste der Button ausgelöst wird?

    LG

    Peter329 schrieb:

    Wie kann ich das denn auch erreichen?

    VB.NET-Quellcode

    1. Button2.Focus()
    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!

    BradApfel schrieb:

    VB.NET-Quellcode

    1. Button1.PerformClick()
    @Peter329 Aber Achtung, dieser Aufruf funktioniert nicht unter allen Gegebenheiten (experimentell festgestellt).
    Mach es so:

    VB.NET-Quellcode

    1. Button1_Click(Button1, EventArgs.Empty)

    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!
    Also ich hab mal versucht das umzusetzen:

    @RFG:

    Ich kann dem Button zum Load Zeitpunkt den Focus geben, indem ich in der Load Prozedur die Anweisung

    Button1.Focus()

    einfüge.

    Danach positioniere ich auf die Felder "Userid" und "Passwort", gebe meine Daten ein und drücke die ENTER Taste. Natürlich passiert nichts, weil Button1 den Focus verloren hat! Wo sollte die Anweisung also stehen?


    @BradApfel

    Ich hab die folgende Prozedur in meine Form eingefügt:

    VB.NET-Quellcode

    1. Private Sub frmLogon_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    2. If e.KeyCode = Keys.Enter Then
    3. Button1.PerformClick()
    4. End If
    5. End Sub


    Die Routine wird aber nicht angesprungen, egal wie oft ich die ENTER Taste drücke! Was mache ich falsch?

    LG

    Peter329 schrieb:

    in der Load Prozedur
    Dazu nimm den TabIndex im Designer.
    Probier mal dies, 3 Button, und drück nur die Leer-Taste:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. MessageBox.Show("Button1_Click")
    3. Button2.Focus()
    4. End Sub
    5. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    6. MessageBox.Show("Button2_Click")
    7. Button3.Focus()
    8. End Sub
    9. Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    10. Button1_Click(Button1, EventArgs.Empty)
    11. End Sub

    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 schrieb:

    Probier mal dies, 3 Button, und drück nur die Leer-Taste:


    Na klar, das Coding verstehe ich ! Und das funktioniert natürlich auch.

    Aber in meinem Fall wird doch gerade KEIN Button gedrückt! Ich fülle die Felder Userid und Passwort aus, und dann drücke ich die Eingabe-Taste oder die Return-Taste! Und damit soll das Ereignis Button1_Click ausgelöst werden.

    So funktionieren viele Anwendungen! Ich hab mir das gerade mal etwa im "Quicken" oder im "WISO-Steuersparbuch" angeschaut! Da funktioniert das genau so! Es ist doch ziemlich umständlich, wenn man erst dem Button den Focus verschaffen muss, bevor man mit Enter die Eingaben bestätigen kann!

    RodFromGermany schrieb:

    Dazu nimm den TabIndex im Designer.


    Das verstehe ich jetzt offen gestanden nicht!

    Peter329 schrieb:

    Aber in meinem Fall wird doch gerade KEIN Button gedrückt! Ich fülle die Felder Userid und Passwort aus, und dann drücke ich die Eingabe-Taste oder die Return-Taste! Und damit soll das Ereignis Button1_Click ausgelöst werden.

    So funktionieren viele Anwendungen!
    Sowas nennt man einen Dialog - und das ist ein Standard-Fall, der im VS vorbildlich unterstützt wird.
    Also gugget DialogResultSample - sowas komisches mit KeyDown ist nicht erforderlich.
    Du meine Güte... Was schlagt ihr denn alle vor?

    @Peter329 hat eine Form mit zwei Textfeldern und einem Button und egal in welchem Textfeld der Focus grad liegt soll ein "Return" den Button auslösen. Das ist die Aufgabe.

    Und das ist die Lösung: Einfach der Eigenschaft AcceptButton der Form den Verweis auf den Button zuweisen. Fertig.

    Beispiel:

    VB.NET-Quellcode

    1. Form1.AcceptButton = Button1

    Geht übrigens auch im Form-Designer über das Eigenschaftenfenster.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Arby schrieb:

    Was schlagt ihr denn alle vor?
    Das, was sich bei einer solch präzisen Aufgabenstellung halt vorschlagen lässt.
    @ Peter329 Gugst Du hier. Alle Posts.
    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!
    Die Sache mit dem "Accept-Button" klappt hervorragend! Egal welches Feld den Focus hat, RETURN und ENTER lösen jetzt den Button1 aus. Das war das genau das, wonach ich gesucht hatte.

    Herzlichen Dank also an alle Ratgeber! Ich bin wieder mal restlos begeistert! Meine Anwendung sieht jetzt mit dem eingefärbten Menu-Strip nicht nur gut aus, sondern sie funktioniert Dank Accept-Button auch hervorragend!

    LG
    Peter

    ErfinderDesRades schrieb:

    Cancel-Button
    Das geht auch ohne Button, es genügt, im Dialog den entsprechenden DialogResult zu setzen.
    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!
    gugget mal mein Tut - da ist gezeigt, wie ein Cancel-Button im Designer zu bestimmen ist, sodass man ohne jeden Code die volle Funktionalität des Dialog-Patterns hat:
    Schließen und Bestätigen durch den Ok-Button - alternativ Enter-Taste
    Schließen und Canceln durch den Cancel-Button - alternativ Escape-Taste

    Die jeweiligen DialogResults werden dann von der myDialog.ShowDialog()-Methode zurückgegeben.

    Ich wüsste jetzt nicht wie man ohne CancelButton einem Button das Cancel-DialogResult zuweisen sollte, oder dem Form den Cancel-Button. Wurde ja bereits gesagt: Form-KeyPreview + KeyDown-Events und Kram macht man ja nur, wenn man das mittm Cancel-/Accept-Button nicht kennt.

    ErfinderDesRades schrieb:

    Ich wüsste jetzt nicht wie man ohne CancelButton einem Button das Cancel-DialogResult zuweisen sollte
    Dem dlg.ShowDialog()-Resultat so:

    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    2. Me.DialogResult = Windows.Forms.DialogResult.Cancel
    3. End Sub

    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!

    Noyne schrieb:

    wie als hätte er den Focus
    Weil: Er hat den Focus.
    Gib ihm einen von 0 verschiedenen TabIndex.
    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!
    Ne, ich mein, wenn ich beim Form im Designer die AcceptButton-Eigenschaft setz', wird der Button so blau umrandet.

    Das mit dem TabIndex ist schon in Ordnung so, nur im Designer die blaue Umrandung, die stört mich etwas ...
    Bilder
    • AcceptButton01.jpg

      66,47 kB, 967×553, 169 mal angesehen
    Your computer is running... You better go chase it! :P :D

    Noyne schrieb:

    ich hab das eben auch mal getestet mit dem AcceptButton und gemerkt, dass der aussieht wie als hätte er den Focus (also so blau umrandet) ...


    Das soll so sein. Wenn er tatsächlich den Focus hat, sieht er noch leicht(!) anders aus. Diese spezielle Form der Hervorhebung soll dem Benutzer halt (zurecht und voller Absicht!) darüber informieren, dass dieser Button automatisch ausgelöst wird, wenn er die Return-Taste betätigt, auch wenn der Button nicht direkt(!) den Focus besitzt.

    Bitte versucht nicht, dieses Standard-Design gewaltsam ändern zu wollen, nur weil euch die blaue Farbe in dem Moment grad "nicht schmeckt". Es gibt einfach "zu viele" User da draußen (wenn auch leider nicht genug), die den "Standard" schätzen und auch erwarten.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.