2010-12-13 6 views
6

私はいくつかのテキストボックスとボタンを持つc#windowsフォームアプリケーションを持っています。私は、フォーカスを持っているテキストボックスを見つけて、何かをしたいと思います。私は次のコードを書いていますが、ボタンが押されるとすぐにフォーカスが得られるため、もちろん動作しません。最後のフォーカスでコントロールを調べる

private void button1_MouseDown(object sender, MouseEventArgs e) 
{ 
    foreach (Control t in this.Controls) 
    { 
     if (t is TextBox) 
     { 
      if (t.Focused) 
      { 
       MessageBox.Show(t.Name); 
      } 
     } 
    } 
} 
+1

ボタンはTabキーでフォーカスを取得することもできます。 – 26071986

答えて

15

以前にフォーカスされたコントロールを追跡するためのプロパティまたは機能は組み込まれていません。あなたが言及したように、ボタンがクリックされるたびに、それは焦点を取ります。その前に集中していたテキストボックスを追跡したい場合は、自分で行う必要があります。あなたのそれぞれについて、GotFocusイベントで

private Control _focusedControl; 

そしてこのついて行くの

一つの方法は、現在フォーカステキストボックスコントロールへの参照を保持しているフォームに、クラスレベルの変数を追加することですボタンがクリックされるたびにbuttoするのではなく、あなたの質問に示すように、なぜあなたはMouseDownイベントを使用している(、今

private void TextBox_GotFocus(object sender, EventArgs e) 
{ 
    _focusedControl = (Control)sender; 
} 

:TextBoxコントロールは、あなただけではテキストボックスと_focusedControl変数を更新しますn個のClickイベント)は、クラスレベルの変数に保存され、以前に焦点を当てたテキストボックスコントロールへの参照を使用することができますしかし、あなたは好き?:

private void button1_Click(object sender, EventArgs e) 
{ 
    if (_focusedControl != null) 
    { 
     //Change the color of the previously-focused textbox 
     _focusedControl.BackColor = Color.Red; 
    } 
} 
3

あなたは多分フィールドに(あなたが送信者のパラメータとなるだろう)テキストボックスを格納し、あなたのテキストボックスのGotFocusイベントをサブスクライブ、そしてあなたがボタンを押したときに、このフィールドを使用することができますか?

2

私はbutton1_MouseHoverイベントを使用します。このイベントがトリガーされると、ActiveControlは以前のコントロールを指していて、_focusedControlとして保存できます。

もちろん、ユーザーがボタンをタップすると、これは機能しません。

関連する問題