web-dev-qa-db-ja.com

C#テキストボックスにフォーカスがあるときにEnterキーを押してボタンをクリックする方法を教えてください。

私はC#でWinFormアプリを使用していますが、テキストボックスに何かを入力した後、Enterキーを押したいのですが、テキストボックスにまだフォーカスがあります(点滅カーソルはまだテキストボックスにあります)、どうすればこれを達成できますか?

63
Jason Stevens

単純なオプションは、フォームのAcceptButtonを押したいボタンに設定することです(通常は「OK」など)。

    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 } });

これがオプションではない場合、KeyDownイベントなどを見ることができますが、それはより多くの作業です...

    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 } });
79
Marc Gravell

これを行う通常の方法は、FormAcceptButtonを「クリック」したいボタンに設定することです。これはVSデザイナーまたはコードで行うことができ、AcceptButtonはいつでも変更できます。

これは状況に当てはまる場合も当てはまらない場合もありますが、フォーム上のさまざまなGotFocusesのTextBoxイベントと組み合わせて使用​​し、ユーザーがEnterキーを押した場所に基づいて異なる動作を有効にします。例えば:

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

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

このメソッドを使用する際の注意点の1つは、ProcessTextBox1がフォーカスされたときにAcceptButtonTextBox3に設定したままにしないことです。 LostFocusを設定するTextBoxesでAcceptButtonイベントを使用するか、しないすべてのコントロールでGotFocusメソッドを作成することをお勧めします特定のAcceptButton呼び出しを使用します。

33
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;
     }
}

このKeyDownイベントをテキストボックスにバインドすると、キーを押すたびにこのイベントが発生します。イベント内で、ユーザーが「Enterキー」を押したかどうかを確認します。そうであれば、アクションを実行できます

32
ruvi

私は同じことを自分で探している間にこれに出会いましたが、Enterを押したときにフォームの「AcceptButton」をクリックしたくない場合、リストされた答えのどれも実際に解決策を提供しないことに注意します。

単純なユースケースは、フォームのAcceptButton動作を実行するのではなく、Enterキーを押して「検索」ボタンを「クリック」する画面上のテキスト検索ボックスです。

この小さなスニペットがトリックを行います。

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

私の場合、このコードはTextBoxから派生したカスタムUserControlの一部であり、コントロールには「ClickThisButtonOnEnter」プロパティがあります。しかし、上記はより一般的なソリューションです。

11
RJ Lohan

Enterキーでヒットするボタンに「Accept Button "Property」という形式を設定するだけです。または、ロードイベントでthis.acceptbutton = btnName;

5
user5841303

最も初心者に優しいソリューションは次のとおりです。

  1. デザイナで、これを実行するテキストフィールドをクリックします。プロパティウィンドウ(デフォルト:右下)で、Thunderbolt(イベント)をクリックします。このアイコンは、アルファベット順のソートアイコンとプロパティアイコンの横にあります。

  2. keyDownまで下にスクロールします。右側のドロップダウンフィールドをクリックします。そこに何もないことに気付くでしょう、単純にエンターを押してください。 Visual Studioは次のコードを記述します。

    private void yourNameOfTextbox_KeyDown(object sender, KeyEventArgs e)
    {
    
    }
    
  3. 次に、これを角括弧の間に貼り付けます。

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

これは、クリックしたときと同じように機能します。

3
philx_x

Visual Studio 2017では、c#を使用して、AcceptButton属性をボタンに追加します(私の例では「btnLogIn」)。

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

これをフォームのコンストラクターに追加します。

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

または、この単純な2ライナーコードを使用できます。

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

あなたはキーアップイベントでそれをトラップすることができます http://www.itjungles.com/dotnet/c-how-to-easily-detect-enter-key-in-textbox-and-execute-a-method

0
user344760

これは、WinFormsで非常に有効です。ただし、WPFではさまざまなことを行う必要があり、簡単です。このテキスト領域に関連するButtonIsDefaultプロパティをtrueに設定します。

Enterキーのキャプチャが完了したら、それに応じてプロパティを切り替えることを忘れないでください。

0
r3st0r3

私の状況では、TextBoxはEnterキーをまったく受け取りませんでした。最初に試したのは、Enterキーを入力キーに変更することでしたが、Enterを押したときにシステムのビープ音が鳴っていました。そこで、ProcessDialogKey()メソッドをサブクラス化してオーバーライドし、クリックハンドラーをバインドできる独自のイベントを送信しました。

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