私はC#でWinFormアプリを使用していますが、テキストボックスに何かを入力した後、Enterキーを押したいのですが、テキストボックスにまだフォーカスがあります(点滅カーソルはまだテキストボックスにあります)、どうすればこれを達成できますか?
単純なオプションは、フォームの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 } });
これを行う通常の方法は、Form
のAcceptButton
を「クリック」したいボタンに設定することです。これはVSデザイナーまたはコードで行うことができ、AcceptButton
はいつでも変更できます。
これは状況に当てはまる場合も当てはまらない場合もありますが、フォーム上のさまざまなGotFocus
esのTextBox
イベントと組み合わせて使用し、ユーザーがEnterキーを押した場所に基づいて異なる動作を有効にします。例えば:
void TextBox1_GotFocus(object sender, EventArgs e)
{
this.AcceptButton = ProcessTextBox1;
}
void TextBox2_GotFocus(object sender, EventArgs e)
{
this.AcceptButton = ProcessTextBox2;
}
このメソッドを使用する際の注意点の1つは、ProcessTextBox1
がフォーカスされたときにAcceptButton
をTextBox3
に設定したままにしないことです。 LostFocus
を設定するTextBox
esでAcceptButton
イベントを使用するか、しないすべてのコントロールでGotFocus
メソッドを作成することをお勧めします特定のAcceptButton
呼び出しを使用します。
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キー」を押したかどうかを確認します。そうであれば、アクションを実行できます
私は同じことを自分で探している間にこれに出会いましたが、Enterを押したときにフォームの「AcceptButton」をクリックしたくない場合、リストされた答えのどれも実際に解決策を提供しないことに注意します。
単純なユースケースは、フォームのAcceptButton動作を実行するのではなく、Enterキーを押して「検索」ボタンを「クリック」する画面上のテキスト検索ボックスです。
この小さなスニペットがトリックを行います。
private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
{
if (!textBox.AcceptsReturn)
{
button1.PerformClick();
}
}
}
私の場合、このコードはTextBoxから派生したカスタムUserControlの一部であり、コントロールには「ClickThisButtonOnEnter」プロパティがあります。しかし、上記はより一般的なソリューションです。
Enterキーでヒットするボタンに「Accept Button "Property」という形式を設定するだけです。または、ロードイベントでthis.acceptbutton = btnName;
最も初心者に優しいソリューションは次のとおりです。
デザイナで、これを実行するテキストフィールドをクリックします。プロパティウィンドウ(デフォルト:右下)で、Thunderbolt(イベント)をクリックします。このアイコンは、アルファベット順のソートアイコンとプロパティアイコンの横にあります。
keyDown
まで下にスクロールします。右側のドロップダウンフィールドをクリックします。そこに何もないことに気付くでしょう、単純にエンターを押してください。 Visual Studioは次のコードを記述します。
private void yourNameOfTextbox_KeyDown(object sender, KeyEventArgs e)
{
}
次に、これを角括弧の間に貼り付けます。
if (e.KeyCode == Keys.Enter)
{
yourNameOfButton.PerformClick();
}
これは、クリックしたときと同じように機能します。
Visual Studio 2017では、c#を使用して、AcceptButton属性をボタンに追加します(私の例では「btnLogIn」)。
this.btnLogIn = new System.Windows.Forms.Button();
//....other settings
this.AcceptButton = this.btnLogIn;
これをフォームのコンストラクターに追加します。
this.textboxName.KeyDown += (sender, args) => {
if (args.KeyCode == Keys.Return)
{
buttonName.PerformClick();
}
};
または、この単純な2ライナーコードを使用できます。
if (e.KeyCode == Keys.Enter)
button1.PerformClick();
あなたはキーアップイベントでそれをトラップすることができます http://www.itjungles.com/dotnet/c-how-to-easily-detect-enter-key-in-textbox-and-execute-a-method
これは、WinFormsで非常に有効です。ただし、WPFではさまざまなことを行う必要があり、簡単です。このテキスト領域に関連するButtonのIsDefaultプロパティをtrueに設定します。
Enterキーのキャプチャが完了したら、それに応じてプロパティを切り替えることを忘れないでください。
私の状況では、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);
}
}