【C#】ボタンをクリックした場合の、直前のアクティブコントロールの取得
フォーム(コンテナ)上で、現在フォーカスのあるアクティブコントロールは、ActiveControlのプロパティ取得できます。
この時、ボタンをクリックした時に、その直前にアクティブだったコントロールが取りたい場合のメモ。
ボタンのクリックイベントでActiveControlを取得しても、既にActiveControlはクリックしたボタンとなっています。
そのため、その直前を覚えておくためには、対象の子コントロールのLeaveイベントを全て拾ってその都度最後のコントロール内部的に保持しておく、、なんてことが必要となる訳ですが、そもそもボタンにフォーカスが当たらないようにすれば、これを回避できます。
この設定は、ControlのSetStyleメソッドで、ControlStyles.Selectableをfalseにするだけ。
ただし、SetStyleはprotectedのため、Buttonの派生クラスを作って設定すればOK。
ちなみにReflection(System.Reflection)の機能を使えば、隠蔽されたメソッドを、無理やり実行させることもできるようです。
※参考
隠蔽されている非パブリックメンバを呼び出す: .NET Tips: C#, VB.NET
今回のSetStyleを実行する場合は、以下のようになります。
button1.GetType().InvokeMember(
"SetStyle",
BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.InvokeMethod,
null,
button1,
new object[]{ControlStyles.Selectable,false});
結構飛び道具的な方法ですが、このSetStyleを設定したいだけで、派生クラスを作るまでもない場合は、これでも良いかもしれませんね。