2016-07-25 4 views
1

私は、enter cursorを押して次のコントロールに移動するという機能を追加するために、keyupイベントを使用します。このイベントは機能しますが、テキストボックスに何かを入力してEnterキーを押すと、次のコントロールに移動しますが、前のコントロールで入力した文字はクリアされます。私は自分のコードのどこにでも明確な機能を追加しませんでした。C#keyupイベントの問題

private void nametextBox_KeyUp(object sender, KeyEventArgs e) 
    { 
     if(e.KeyCode == Keys.Enter) 
     { 
      this.SelectNextControl(nametextBox, true, true, true, true); 
     } 
    } 

    private void emailtextBox_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Enter) 
     { 
      this.SelectNextControl(agetextBox, true, true, true, true); 
     } 

    } 
+0

SelectNextControlメソッドで送信者コードを表示できますか? –

+1

'SelectNextControl'は[フレームワークメソッド](https://msdn.microsoft.com/en-us/library/system.windows.forms.control.selectnextcontrol(v = vs.110).aspx) – dlatikay

+1

ですあなたのnameTextBox_KeyUpはnameTextBoxをSelectNextControlに渡していますか?あなたは別のコントロールを渡すべきですか? – Tom

答えて

4

私はあなたのコントロールに新しい行を追加し、テキスト隠している疑いがあるデフォルトのキーアクションを防止するためにtruee.Handledフラグを設定します:

if(e.KeyCode == Keys.Enter) 
    { 
     this.SelectNextControl(nametextBox, true, true, true, true); 
     e.Handled = true; 
    } 

あなたが必要となりますがここで は、コードです新しい行が入力されたりテキストが隠れたりしないようにするには、ProcessCmdKeyを上書きしてください。 (あるいは、テキストボックスが1行になるように設定することもできます)。それ以外の場合は、これをウィンドウロジックに追加してください。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    if (keyData == Keys.Enter) 
     return true; 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

trueを返すと、デフォルトのコマンドを実行しないでください。これはウィンドウ内のすべてのコントロールに影響します。つまり、必要に応じて改行機能を手動で追加する必要があります。

キーアップイベントごとに同じハンドラーを使用することをお勧めします。

private void Control_KeyUp(object sender, KeyEventArgs e) 
{ 
    if(e.KeyCode == Keys.Enter) 
     if(sender is Control) 
      this.SelectNextControl((Control)sender, true, true, true, true); 
} 
+0

それはうまくいかない。 –

+0

私はデモアプリケーションを作成し、それは私のために働く。私は2つのTextBoxコントロールを使用しています。テキストボックスを使用していますか? – Lew

+0

テキストボックスを複数行に設定するのを忘れました。謝罪いたします。私は解決策を見つけました。編集した回答を数分で確認してください。 – Lew

関連する問題