2017-11-07 21 views
0

MSアクセスデータベース(2016)を開発中です。MS Access:他のコントロールでフォーカスが失われたときにサブフォームを非表示にする

1つのサブフォームを含む多数のコントロールを持つメインフォーム(MF)があります。このサブフォームはSFであり、MFの2つのコントロールに関連しています。 C1およびC2と名付けられたこれらのコントロール。

MFがロードされているとき、SFは表示されません。

C1又はC2がフォーカスを得たとき、SF視認性Trueに設定されています。

今、私は必要なものは次のとおりです。

の1- FalseSF可視性を設定するにはC1または一度C2SFを除いて他のコントロールのフォーカスを失いました。

2-それはC1C2を除いMF上の任意のコントロールのフォーカスを失ったらFalseSF可視性を設定します。

初めはシンプルに見えましたが、まっすぐに見えましたが、そうではありません。

私が使用:

Private Sub C1_GotFocus() 
    Me.SF.Visible = True 
End Sub 

Private Sub C2_GotFocus() 
    Me.SF.Visible = True 
End Sub 

Private Sub C1_LostFocus() 
    Me.SF.Visible = False 
End Sub 

Private Sub C2_LostFocus() 
    Me.SF.Visible = False 
End Sub 

Private Sub SF_LostFocus() 
    Me.SF.Visible = False 
End Sub 

を今すぐC1またはC2はそれが消え、私はC1C2ために必要な情報を選択することはできませんSFための制御を失った場合。 SFが、それはifいくつかのステートメントでこれを修正するのは簡単に思えた

を消えないC1C2に対するフォーカスを失った場合

はまた、しかし、このケースではありません。

フォーカスを取得する新しいコントロールは、LostFocus()イベントによって予測できないという問題があります。したがって、このようにするのは難しいです。

ネットを検索して解決策を見つけましたが、私は何も使用できませんでした。

回避策は、C1C2SFとゲインがSFを隠すために集中することをMF上の他のすべての単一のコントロールを設定するためLostFocus()イベントを省略することであろう。

これは私の必要に応じて機能しますが、実際的な解決策ではないようです。

これを達成するためのより単純で合理的な方法はありますか?

メインフォームには、このようにコード化するコントロールが多すぎます。

ありがとうございました。

答えて

0

MFのOnCurrentイベントを使用することを検討します。これは、新しいレコードが設定されたときに起動されるか、新しいレコードに移動するときに発生します。 C1またはC2が編集可能かどうかはわかりません。そうでなければ、それは簡単です。そうであれば、SFの可視性を設定する前に、両方に値があることを確認するだけです。 MFの背後にあるコードには、 "SetSubformVisibility"のような名前で、イベントにバインドされていない1つの関数が必要です。その中で、C1とC2の値をチェックし、それに応じてSFを表示/非表示にします。表示されていない場合は、表示のみを設定してください。

If Me.SF.Visible = true THEN Me.SF.Visible = False 

このように、イベントモデルの仕組みに沿ってアクセスがちらつくため、必ずしもこの設定を行っているわけではありません。このようにして、それが必要以上に動くなら、何も起こりません。フォームのOnFocus、OnLostFocus、OnCurrentなどでこの単一の関数を呼び出すことができます。 C1とC2の編集可能性に応じて、OnCurrentで十分です。

OnLoadなど、一部のロジックをSFに移動することもできます。親フォームを参照して、必要に応じてSF RecordSourceをプログラムで変更することができます。サブフォームコントロールのLinkChild/Masterプロパティを使用することは困難です。

幸運を祈る!

+0

ありがとう@DanielG、** C1 **、** C2 **は編集可能で** SF **コンテンツをフィルタリングするために使用されます。必要な値が** SF **に表示されているときは、ダブルクリックすると選択できます。問題は、アクティブなコントロールが** C1 **、** C2 **または** SF **の場合は、** SF **サブフォームを**表示のみ**に保つ方法です。そうでなければ、それは隠されるべきです。この問題は、** C1 **または** C2 **からフォーカスが失われた場合に発生します。フォーカスコードを失うと** SF **が隠れるからです。フォーカスが** SF **自身に移行している場合は、** ** ** ** ** ** ** ** ** ** ** **を隠さないようにどのように指示できますか? – Shadi

+0

C1とC2のAfterUpdateイベントはおそらくもっとうまくいくでしょうか?言い換えれば、この値が変更された場合に限り、何かが行われるべきである。また、あなたのコードでScreen.ActiveControlプロパティを組み込むことを検討し、C1、C2、またはSFのいずれかの場合は、hideプロパティを短絡しますか? – DanielG

+0

もう1つのアイデアは、サブフォームを再クエリーする「Apply Filter」というボタンがあることです。 C1とC2が(フィールドにバインドされていない)バインドされていないフィルタコントロールである場合、ユーザーに1つ以上のパラメータを入力させ、次に適用ボタンを押します。そのボタンの背後にあるコードは、制御された方法でロジックを実行でき、2つのパラメータを同時に適用できます。 – DanielG

関連する問題