私はWinFormにいくつかのTextBoxを持っています。 Enterキーが押されたときに次のコントロールにフォーカスを移動したいですか?テキストボックスがコントロールを得るたびに、テキストも選択されるので、現在のテキストと置き換えられます。Enterキーを押して次のコントロールに移動します
これを行うにはどのような方法が最適ですか?
私はWinFormにいくつかのTextBoxを持っています。 Enterキーが押されたときに次のコントロールにフォーカスを移動したいですか?テキストボックスがコントロールを得るたびに、テキストも選択されるので、現在のテキストと置き換えられます。Enterキーを押して次のコントロールに移動します
これを行うにはどのような方法が最適ですか?
Enter as Tab:テキストボックスを継承するユーザーコントロールを作成し、KeyPress
メソッドをオーバーライドします。ユーザがenterを押すと、SendKeys.Send("{TAB}")
またはSystem.Windows.Forms.Control.SelectNextControl()
に電話することができます。 KeyPress
イベントを使用して同じことを達成できることに注意してください。
フォーカス全体テキスト:再度、オーバーライドまたはイベントを介してGotFocus
イベントをターゲットにしてから、TextBox.Select
メソッドを呼び出します。
テキストボックスにKeyPress
ハンドラを配置して、どのキーが使用されているかを確認できます。
テキスト選択を処理するには、GotFocus
イベントにハンドラを配置します。
また、複数行のテキストボックスを処理する方法(または必要がある場合)を検討することもできます。 KeyPressイベントで
、押されたユーザーが入力した場合、自動的にフォーカスを受け取るには、テキストを選択し実装するために呼び出す
SendKeys.Send("{TAB}")
素敵な方法は、次のオーバーライドを使用して、プロジェクト内のTextBoxのサブクラスを作成することです。
Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
SelectionStart = 0
SelectionLength = Text.Length
MyBase.OnGotFocus(e)
End Sub
次に、すべてのフォームでWinForms標準テキストボックスの代わりにこのカスタムテキストボックスを使用します。
これが役立つことがあります。
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
//
// Detect the KeyEventArg's key enumerated constant.
//
if (e.KeyCode == Keys.Enter)
{
MessageBox.Show("You pressed enter! Good job!");
}
}
コード例のカップルをSelectNextControlを使用してC#で。
を押すと、次のコントロールに移動します。
private void Control_KeyUp(object sender, KeyEventArgs e)
{
if((e.KeyCode == Keys.Enter) || (e.KeyCode == Keys.Return))
{
this.SelectNextControl((Control)sender, true, true, true, true);
}
}
第二は、コントロールを移動するDOWN UPと矢印を使用しています。
private void Control_KeyUp(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Up)
{
this.SelectNextControl((Control)sender, false, true, true, true);
}
else if(e.KeyCode == Keys.Down)
{
this.SelectNextControl((Control)sender, true, true, true, true);
}
}
これは、開発者がTabStopとTabIndexのプロパティを正しく設定していることを前提としています。 – user3902302
あなたが現在のフォームのすべてのコントロールにこれを適用したい場合は、「(コントロール)送信者」上記のコードでは、「ACTIVECONTROL」とし、TrueにフォームのプロパティKeyPreviewのを設定し、フォームのKeyUpイベントに登録して交換することができます。 –
を参照してください。また、ケースには、あなたがより頻繁にこれを使用したい、このための独自のコントロールを書くことができます。使用してみてください
public class AdvanceOnEnterTextBox : UserControl
{
TextBox _TextBox;
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(String), typeof(AdvanceOnEnterTextBox), null);
public static readonly DependencyProperty InputScopeProperty = DependencyProperty.Register("InputScope", typeof(InputScope), typeof(AdvanceOnEnterTextBox), null);
public AdvanceOnEnterTextBox()
{
_TextBox = new TextBox();
_TextBox.KeyDown += customKeyDown;
Content = _TextBox;
}
/// <summary>
/// Text for the TextBox
/// </summary>
public String Text
{
get { return _TextBox.Text; }
set { _TextBox.Text = value; }
}
/// <summary>
/// Inputscope for the Custom Textbox
/// </summary>
public InputScope InputScope
{
get { return _TextBox.InputScope; }
set { _TextBox.InputScope = value; }
}
void customKeyDown(object sender, KeyEventArgs e)
{
if (!e.Key.Equals(Key.Enter)) return;
var element = ((TextBox)sender).Parent as AdvanceOnEnterTextBox;
if (element != null)
{
int currentElementPosition = ((Grid)element.Parent).Children.IndexOf(element);
try
{
// Jump to the next AdvanceOnEnterTextBox (assuming, that Labels are inbetween).
((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition + 2)).Focus();
}
catch (Exception)
{
// Close Keypad if this was the last AdvanceOnEnterTextBox
((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition)).IsEnabled = false;
((AdvanceOnEnterTextBox)((Grid)element.Parent).Children.ElementAt(currentElementPosition)).IsEnabled = true;
}
}
}
}
ます。ただし、フォーム上の単一のメソッドを持つことは、あなたが大規模なコードベースを持つことにつながるどの使用しようとしているすべてのコントロールを再書き込み、およびそれらを後でデバッグするよりもはるかに簡単で、もちろんこれを行うことができます。 – AaA
:キーストロークを送信
SendKeys.Send("{TAB}")
private void txt_invoice_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
txt_date.Focus();
}
private void txt_date_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
txt_patientname.Focus();
}
}
は最善の解決策ではありません あなたはグリッド内の複数のTextBoxを持っていると仮定すると、それは次のようになりますタスクを達成するための方法が提供されたとき。 [SelectNextControl(http://msdn.microsoft.com/en-us/library/system.windows.forms.control.selectnextcontrol.aspx)キーを送信することなく、乱雑タブボタンの送信と同じ機能を実行することができます。 – Fr33dan