読者です 読者をやめる 読者になる 読者になる

あらかじめ日記

2chまとめサイト「ソノウソホント?」の雑記と、ブログで使えるスクリプトとかテクニックとか。その他、音楽やアニメ、漫画の話題とかも。

まとめサイト「ソノウソホント?」と「ムードもりあげ楽団」はこちら。

【C#】ボタンをクリックした場合の、直前のアクティブコントロールの取得

プログラミング

フォーム(コンテナ)上で、現在フォーカスのあるアクティブコントロールは、ActiveControlのプロパティ取得できます。

この時、ボタンをクリックした時に、その直前にアクティブだったコントロールが取りたい場合のメモ。


ボタンのクリックイベントでActiveControlを取得しても、既にActiveControlはクリックしたボタンとなっています。

そのため、その直前を覚えておくためには、対象の子コントロールLeaveイベントを全て拾ってその都度最後のコントロール内部的に保持しておく、、なんてことが必要となる訳ですが、そもそもボタンにフォーカスが当たらないようにすれば、これを回避できます。

この設定は、ControlSetStyleメソッドで、ControlStyles.Selectablefalseにするだけ。
ただし、SetStyleprotectedのため、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を設定したいだけで、派生クラスを作るまでもない場合は、これでも良いかもしれませんね。