プロが教える店舗&オフィスのセキュリティ対策術

MDIの子フォームでフォーカスアウトを制御したい

VB2005で開発を行っています。

・MDIの子フォームA、Bが存在します。
・子フォームA、Bともに、表示されています。
・子フォームAにはテキストコントロールAA、ABの2つが存在します。
・テキストコントロールAAのLostFocus()に、テキストコントロールAA.Focus()が
 記されています。

この状態で、子フォームAのテキストコントロールAAからABへフォーカスが移った時、
コントロールAAのLostFocus()で制御するのはうまくいきます。

が、子フォームAのテキストコントロールAAから子フォームBへフォーカスが移った時、
コントロールAAのLostFocus()が動作しますが、無限ループっぽい動きに陥ったり、
子フォームAにフォーカスが設定されません。

子フォームを最小化させたり、全然関係のないアプリケーションやデスクトップに
フォーカスを遷移したあとにフォーカスを戻してみても同じような現象になります。

イメージとしては、フォーカスアウトでエラーになったんだから、フォーカスを移し
たくないです。

Private Sub ControlAA_LostFocus(ByVal sender As System.Object, ByVal e As System.EventArgs)
 If "".Equals(ControlAA.Text) Then
  MessageBox.Show("hoge")
  ControlAA.Focus()
  Return
 End If
End Sub

フォーカスアウト時に項目チェックなどをやる関係で、どうしてもLostFocus()上で
処理をやらなければならないと思われるのですが、フォーカスアウトされた時のオペ
レーションの違いに限らず上手く制御させる方法はありませんでしょうか?

調べてはみましたが、MDIの概念でそもそもそういうことするなというような事らしいですが、
フォーカスアウト時に検索処理が走るというような仕様の為、どうしても解決させたいです。

A 回答 (1件)

> フォーカスアウト時に項目チェックなどをやる関係で、どうしてもLostFocus()上で


> 処理をやらなければならないと思われるのですが、フォーカスアウトされた時のオペ
> レーションの違いに限らず上手く制御させる方法はありませんでしょうか?

Validatingイベントを使えばいいってことでは。

この回答への補足

e.Cancel = True

ということですよね?

これをしても、確かにコントロールにフォーカスがあたっているのですが、
子フォーム自体がアクティブ状態にならず、全てが解決するような動作とは
なってくれませんでした。

それと子フォームのせいなのか、LostFocus()内でコントロールへフォーカス
セットしているせいなのか、LostFocus()がやたら頻繁に動作し、
Validating()イベントを記せば解決するようではないようです。

補足日時:2010/10/20 08:57
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!