2009-07-21 18 views
2

Windowsフォームアプリケーションでコピー貼り付けを実装しています。 ユーザーがアプリケーションのフォーカスされた要素を変更したときに、この2つの操作のバーボタンを有効/無効にする必要があります。Windowsフォーム:フォーカスされたコントロールの変更を検出します。

現在のフォーカスコントロールは、http://www.syncfusion.com/FAQ/windowsforms/faq_c41c.aspx#q1021qのようなものを使用して見つけることができますが、フォーカスされたコントロールが変更されたことをどのように検出できますか?

答えて

1

イベントハンドラをコントロールに追加する必要があります(または同じ種類のものが多く、サブクラス化して、適切なOnChangeハンドラをオーバーライドする必要があります)。この方法では、フォーカスされたコントロール(送信者パラメータとして与えられます)を「見つける」必要がなくなり、イベントは実際に変更が発生したときにのみ発生します。

2

私の提案は、Application.Idleイベントを使用することです。

  • Application.Idleイベントでボタンを有効または無効にするロジックを記述します。
  • ボタンのクリック(あなたが重い負荷の下での偶発的クリックを渡すことはありません)
  • が破棄フォーム(または決算)にアイドルハンドラを削除することを忘れないでください上のイベント
  • チェックボタンの可用性を示すフォームにApplication.Idleイベントにサブスクライブこれは静的イベントであるため、

このテクニックを使用すると、常に正しいボタン状態になり、多くのコントロールイベントを購読してフォーカス変更を検出する心配はありません。アイドルイベントは、アプリケーションがビジーでない場合にのみ発生するため、これも軽量アプローチです。フォームロードイベントハンドラで

7

あなたもフォームで、各フォーカス可能な制御のために含まれるすべてのコントロールをループは、入力イベントのイベントハンドラを追加することができます。

private void Form1_Load(object sender, EventArgs e) 
    { 
     foreach (Control control in Controls) 
     { 
      control.Enter += ControlReceivedFocus; 
     } 
    } 

    void ControlReceivedFocus(object sender, EventArgs e) 
    { 
     Debug.WriteLine(sender + " received focus."); 
    } 
+0

私はこれを正確に実行しました(これはsztomiの答えと本質的に同じですが、コード例を提供したことが好きです)。ただし、メニュー項目を無効にするには、ControlLostFocus(または何をやっているかによってControlValidating)が必要になります。 – overslacked

+3

また、子コントロールを反復する必要があるかもしれません... \t \t \t \t \t 'if(control.HasChildren)' ... –

0

は上の焦点を検出するためにコントロールあなたは、このイベントを作成することができます。

void MyGotFocus(object sender, EventArgs e) 
{ 
    if (sender is TextBox) 
    { 
     //TODO YOUR OPERATION 
     //FOR EXAMPLE 
     (sender as TextBox).SelectAll(); 
    } 
} 

と次のステップは、コードによってコントロールとイベントを関連付けることである。

myText1.GotFocus += MyGotFocus; 
myText2.GotFocus += MyGotFocus; 
関連する問題