it-swarm.com.de

Wie klicke ich auf eine Schaltfläche, wenn Sie die Eingabetaste drücken, während das Textfeld den Fokus hat?

Ich arbeite mit einer WinForm-App in C #. Nachdem ich etwas in ein Textfeld eingegeben habe, möchte ich die Eingabetaste drücken, aber das Textfeld hat noch den Fokus (blinkender Cursor ist immer noch im Textfeld). Wie kann ich das erreichen?

61
Jason Stevens

Die einfache Option besteht darin, den AcceptButton des Formulars auf die Schaltfläche zu setzen, die Sie drücken möchten (normalerweise "OK" usw.):

    TextBox tb = new TextBox();
    Button btn = new Button { Dock = DockStyle.Bottom };
    btn.Click += delegate { Debug.WriteLine("Submit: " + tb.Text); };
    Application.Run(new Form { AcceptButton = btn, Controls = { tb, btn } });

Wenn dies nicht möglich ist, können Sie das KeyDown-Ereignis usw. betrachten, aber das ist mehr Arbeit ...

    TextBox tb = new TextBox();
    Button btn = new Button { Dock = DockStyle.Bottom };
    btn.Click += delegate { Debug.WriteLine("Submit: " + tb.Text); };
    tb.KeyDown += (sender,args) => {
        if (args.KeyCode == Keys.Return)
        {
            btn.PerformClick();
        }
    };
    Application.Run(new Form { Controls = { tb, btn } });
78
Marc Gravell

Die übliche Methode, dies zu tun, besteht darin, die Form von _AcceptButton auf die Schaltfläche zu setzen, auf die Sie "klicken" möchten. Sie können dies entweder im VS-Designer oder im Code tun, und AcceptButton kann jederzeit geändert werden.

Dies kann auf Ihre Situation zutreffen oder nicht, aber ich habe dies in Verbindung mit GotFocus-Ereignissen für verschiedene TextBoxes in meinem Formular verwendet, um ein anderes Verhalten zu ermöglichen, je nachdem, wo der Benutzer die Eingabetaste gedrückt hat. Zum Beispiel:

void TextBox1_GotFocus(object sender, EventArgs e)
{
    this.AcceptButton = ProcessTextBox1;
}

void TextBox2_GotFocus(object sender, EventArgs e)
{
    this.AcceptButton = ProcessTextBox2;
}

Wenn Sie diese Methode verwenden, sollten Sie aufpassen, dass AcceptButton nicht auf ProcessTextBox1 eingestellt ist, wenn TextBox3 fokussiert wird. Ich würde empfehlen, entweder das LostFocus-Ereignis für die TextBoxes zu verwenden, das die AcceptButton-Einstellung festlegt, oder eine GotFocus-Methode zu erstellen, die alle Steuerelemente verwendet, die keinen bestimmten AcceptButton-Aufruf verwenden.

31
Jon Norton
private void textBox_KeyDown(object sender, KeyEventArgs e)
{
     if (e.KeyCode == Keys.Enter)
     {
         button.PerformClick();
         // these last two lines will stop the beep sound
         e.SuppressKeyPress = true;
         e.Handled = true;
     }
}

Binden Sie dieses KeyDown-Ereignis an das Textfeld. Wenn Sie eine Taste drücken, wird dieses Ereignis ausgelöst. Innerhalb der Veranstaltung überprüfen wir, ob der Benutzer die Eingabetaste gedrückt hat. Wenn ja, können Sie Ihre Aktion ausführen 

31
ruvi

Ich bin auf dieses Problem gestoßen, als ich selbst nach dem gleichen Ding suchte. Ich stelle fest, dass keine der aufgeführten Antworten tatsächlich eine Lösung darstellt, wenn Sie beim Drücken der Eingabetaste nicht auf "AcceptButton" in einem Formular klicken möchten. 

Ein einfacher Anwendungsfall wäre ein Textsuchfeld auf einem Bildschirm, in dem durch Drücken der Eingabetaste die Schaltfläche "Suchen" angeklickt und nicht das AcceptButton-Verhalten des Formulars ausgeführt wird.

Dieser kleine Ausschnitt wird den Trick tun;

private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 13)
    {
        if (!textBox.AcceptsReturn)
        {
            button1.PerformClick();
        }
    }
}

In meinem Fall ist dieser Code Teil eines benutzerdefinierten UserControls, das von TextBox abgeleitet ist, und das Steuerelement verfügt über die Eigenschaft 'ClickThisButtonOnEnter'. Das obige ist jedoch eine allgemeinere Lösung.

11
RJ Lohan

Setzen Sie einfach das Formular " Accept Button " Eigenschaft auf die Schaltfläche, die Sie mit der Eingabetaste drücken möchten Oder schreiben Sie in das Ereignis load this.acceptbutton = btnName;.

5
user5841303

Anfängerfreundlichste Lösung ist:

  1. Klicken Sie in Ihrem Designer auf das Textfeld, in dem dies geschehen soll. Klicken Sie im Eigenschaftenfenster (Standard: unten rechts) auf den Thunderbolt (Ereignisse). Dieses Symbol befindet sich neben dem alphabetischen Sortiersymbol und dem Eigenschaftssymbol.

  2. Scrollen Sie nach unten zu keyDown. Klicken Sie rechts auf das Dropdown-Feld. Sie werden feststellen, dass nichts darin ist, drücken Sie einfach die Eingabetaste. Visual Studio schreibt Ihnen den folgenden Code:

    private void yourNameOfTextbox_KeyDown(object sender, KeyEventArgs e)
    {
    
    }
    
  3. Dann fügen Sie dies einfach zwischen den Klammern ein:

    if (e.KeyCode == Keys.Enter)
    {
         yourNameOfButton.PerformClick();
    }
    

Dies wird so tun, als hätten Sie es angeklickt.

3
philx_x

Fügen Sie dies dem Konstruktor des Formulars hinzu:

this.textboxName.KeyDown += (sender, args) => {
    if (args.KeyCode == Keys.Return)
    {
        buttonName.PerformClick();
    }
};
1
Michael

Oder Sie können diesen einfachen 2-Liner-Code einfach verwenden :)

if (e.KeyCode == Keys.Enter)
            button1.PerformClick();
1
jake mariano

Fügen Sie in Visual Studio 2017 mit c # einfach das AcceptButton-Attribut zu Ihrer Schaltfläche hinzu, in meinem Beispiel "btnLogIn":

this.btnLogIn = new System.Windows.Forms.Button();
//....other settings
this.AcceptButton = this.btnLogIn;
1
zdarova
0
user344760

Dies gilt sehr für WinForms. In WPF müssen Sie jedoch etwas anders machen, und es ist einfacher. Legen Sie die IsDefault - Eigenschaft des Buttons für diesen Textbereich als true fest.

Vergessen Sie nicht, die Eigenschaften entsprechend zu ändern, nachdem Sie die Eingabetaste erfasst haben.

0
r3st0r3

Die TextBox hat in meiner Situation überhaupt keine Eingabetaste erhalten. Als Erstes habe ich versucht, die Eingabetaste in eine Eingabetaste zu ändern, aber beim Drücken der Eingabetaste ertönte immer noch ein Piepton. Also habe ich die ProcessDialogKey () - Methode subclassed und überschrieben und mein eigenes Ereignis gesendet, an das ich den Click-Handler binden könnte.

public class EnterTextBox : TextBox
{
    [Browsable(true), EditorBrowsable]
    public event EventHandler EnterKeyPressed;

    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (keyData == Keys.Enter)
        {
            EnterKeyPressed?.Invoke(this, EventArgs.Empty);
            return true;
        }
        return base.ProcessDialogKey(keyData);
    }
}
0
Matt Gregory