私はいくつかのテキストボックスを持っています。 EnterボタンをTabとして機能させたいのですが。そのため、あるテキストボックスにいるときにEnterキーを押すと、次のテキストボックスに移動します。テキストボックスクラス内にコードを追加せずにこのアプローチを実装する方法を教えてください(可能であればオーバーライドしないなど)?
これが私が普段使っているコードです。 KeyDownイベントである必要があります。
if (e.KeyData == Keys.Enter)
{
e.SuppressKeyPress = true;
SelectNextControl(ActiveControl, true, true, true, true);
}
[〜#〜]更新[〜#〜]
他の方法は「TAB」キーを送ることです!そして、メソッドをオーバーライドすると、それがとても簡単になります:)
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Enter))
{
SendKeys.Send("{TAB}");
}
return base.ProcessCmdKey(ref msg, keyData);
}
任意のコントロールのkeyDownに書き込むことができます。
if (e.KeyCode == Keys.Enter)
{
if (this.GetNextControl(ActiveControl, true) != null)
{
e.Handled = true;
this.GetNextControl(ActiveControl, true).Focus();
}
}
GetNextControlは Vista では機能しません。
Vistaで動作させるには、次のコードを使用してthis.GetNextControl ...を置き換える必要があります。
System.Windows.Forms.SendKeys.Send("{TAB}");
「Enterイベントハンドラ」を作成する必要はありません
あなたがする必要があるのは「中央」KeyDownイベントを作ることだけです:
例
private void General_KeyDown(object sender, KeyPressEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
if (this.GetNextControl(ActiveControl, true) != null)
{
e.Handled = true;
this.GetNextControl(ActiveControl, true).Focus();
}
}
}
次に、デザイナーに行ってEnterKeyで循環させたいすべてのテキストボックスを選択し(Ctrlを押しながらマウスでテキストボックスをクリックして選択し)、イベント(ボタンのようなもの)に移動し、Keydownイベントを検索して入力します。 General_KeyDown内。これで、選択したすべてのテキストボックスに同じキーダウンイベントが発生します:)これにより、すべてが非常に簡単になり、100個のテキストボックスを持つフォームを想像して、Enterですべてを循環させたいと考えています。プログラムを作成するための適切な方法ではありません。それが役に立てば幸い!!
ブロッククォート
コントロールが関連付けられたボタンコントロールとe.Handled = true
は、常にノイズ/サウンド/丁を取り除くための答えではありません。
コントロール(つまり、1行のテキストボックス)が、関連付けられたボタンでエントリを「ENTER」することを期待している場合は、「欠落」しているコントロールにも対処する必要があります。
e.Handled = e.SuppressKeyPress = true;
これは、「Ding」音を取り除くときに役立ちます。
私の状況では、ターミナル/グリーンスクリーンアプリケーションからWindowsアプリに移行するときにユーザーが「Enterキー」を使用する必要があり、タブ移動ではなくフィールドを介して「Enter」することに慣れていました。 。
これらの方法はすべて機能しましたが、e.SuppressKeyPress
。
すべてのコントロールのタブオーダーを定義してForm.KeyPreview = Trueにする場合、これだけが必要です。
Private Sub frmStart_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.Enter Then
System.Windows.Forms.SendKeys.Send("{TAB}")
End If
End Sub
これは私のために働いた
if (e.Key == Key.Enter)
((TextBox)sender).MoveFocus(new TraversalRequest(new FocusNavigationDirection()));
これは私がVB.NETに使用するソリューションです
フォームのプロパティでKeypreview = Trueを設定します。
このコードをフォームのkeydownイベントに配置します。
If(e.KeyData = Keys.Enter)Then
'マルチラインコントロールの場合は、終了してマルチライン' textbox intro 'を押すと、行がスキップされます。
If ActiveControl.Name = txtMyMutilineTextBox.Name Then Exit Sub
e.SuppressKeyPress = True
SelectNextControl(ActiveControl, True, True, True, True)
終了する場合
お楽しみください!!!!
Xabier Aberasturi Larruzea
あなたのそれらのためのVBのコード...
Public Class NoReturnTextBox
Inherits System.Windows.Forms.TextBox
Const CARRIAGE_RETURN As Char = Chr(13)
' Trap for return key....
Private Sub NoReturnTextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
If e.KeyChar = CARRIAGE_RETURN Then
e.Handled = True
System.Windows.Forms.SendKeys.Send(vbTab)
End If
End Sub
End Class
フォームレベルでは行いません。これを実行したいすべての入力KeyDownイベントで共有する単一のメソッドを作成します(1つの例外があります)。
private void alltextBoxes_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
SelectNextControl(ActiveControl, true, true, true, true);
}
}
catch
{
}
}
他のアプリケーションで使用したいコントロールを作成している場合は、最後の入力に次のような独自のメソッドを指定します。
private void lastinput_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
System.Windows.Forms.SendKeys.Send("{TAB}");
}
}
catch
{
}
}
それ以外の場合は、別のプロジェクトで実行しようとしたときに、コントロールがループするだけです。 2番目の方法はどこでも使用できますが、1番目の方法をお勧めします。
このコードをテキストボックスのキーダウンイベントの1つで使用します
if (e.KeyData == Keys.Enter)
{
e.SuppressKeyPress = true;
SelectNextControl(ActiveControl, true, true, true, true);
}
フォームのすべてのテキストボックスでこのkeydown
イベントを処理できません。何か提案してください。ありがとう