none
Access2010にて、AfterUpdateイベントで、フィルタリング機能を使うとタブ移動されない RRS feed

  • 質問

  • いつもお世話になっております。

    Access2010にて、以下の環境で、

    テキストに値を入力したら、AfterUpdateイベントで、フォームのデータ一覧を入力した値にフィルタリングさせています。

    ・テキスト1に値を入力して、エンターを押すと次の項目に行くはずが、テキスト1にカーソルが留まってしまいます。

    (AfterUpdateイベントの時に、フィルタ機能をオンにした時だけ確認できて、値を記入せずに、タブキーやエンターをした場合は問題ありません)

    (フィルタリング機能を使用した時だけ症状が確認されます

    ----------------------------------------------------------

    ◇テーブル1
    項目1
    A
    B
    C
    --------------------------------------------
    フォーム
    レコードソース:テーブル1
    -------------------------------------------------
    Private Sub テキスト1_AfterUpdate()
        Me.Filter="項目1='" & テキスト1 & "'"
        Me.FilterOn=True
    End Sub

    2014年12月25日 0:27

回答

  • こんにちは

    残念ですが仕様だと思います。

    正確には、カーソルが移動しないのではなく、カーソル位置が初期化されるはずです。
    TabIndexがゼロのコントロールにカーソルが移動します。
    貴方の環境では、テキスト1がTabIndex=0になっていると思います。

    テキスト1_AfterUpdate の最後で、[移動したいコントロール名].SetFocusで移動させるしかないと思います。
    (TabキーをSendkeysという方法もありますね)

    似たような現象で、複数レコード表示中にRequeryをすると、カーソルが最初の行に移動してしまう ということもあります
    このときも、Requeryの前でBookmarkを退避させ、Requery後でBookmarkに退避していたBookmarkをセットする なんてこともしなければなりません。

    ご参考まで


    Shigeru Murai / SIMOZ

    • 回答としてマーク IndoaK119 2015年3月12日 1:24
    2015年1月6日 1:55

すべての返信

  • こんにちは

    残念ですが仕様だと思います。

    正確には、カーソルが移動しないのではなく、カーソル位置が初期化されるはずです。
    TabIndexがゼロのコントロールにカーソルが移動します。
    貴方の環境では、テキスト1がTabIndex=0になっていると思います。

    テキスト1_AfterUpdate の最後で、[移動したいコントロール名].SetFocusで移動させるしかないと思います。
    (TabキーをSendkeysという方法もありますね)

    似たような現象で、複数レコード表示中にRequeryをすると、カーソルが最初の行に移動してしまう ということもあります
    このときも、Requeryの前でBookmarkを退避させ、Requery後でBookmarkに退避していたBookmarkをセットする なんてこともしなければなりません。

    ご参考まで


    Shigeru Murai / SIMOZ

    • 回答としてマーク IndoaK119 2015年3月12日 1:24
    2015年1月6日 1:55
  • 返答をありがとうございます。

    Enter、Tab,マウスクリック など、様々なパターンでAfterUpdateイベントが実行されますので、SedKeysのSelect文では、イレギュラーに対応できない可能性があるかと思います。

    FilterOn=Trueにする前に、本来移動されるカーソルに移動させてから、その位置を記憶して、

    その後にFilterOn=Trueさせてから、カーソル位置を修正するような方法はありませんでしょうか?

    可能な限り違和感なく操作させたいため

    2015年1月6日 2:37
  • いろいろなケースがあるのでしたら、それぞれのケースに応じてプログラミングするしかないと思います。

    実際にFilterの値を変更したら、内部的に画面が書き換わってしまいますので、カーソル位置が初期化されます。
    (正確には、一度FilterOnにしたらFilter値が変更された時点で、FilterOnでないときは、FilterOnになった時点で画面が書き換わります)
    ですが、Loadイベントなどが発生するわけではありません。
    なので、この場合FilterOn=trueの後に、ケース別にカーソル移動先を変更してやらないといけません。

    あるいは、仕様変更が可能ならば、Filterを適用するボタンを追加して、そこをクリックしてもらうようにする などの対応が必要かと思います。

    テキスト1のAfterUpdateをいったん素通りさせて、その先のコントロールのGotFocusで Filterが変わったか否かを確認して変わったのならFilter適用してそのコントロールにカーソルを移動する なんてこともできないわけではないですが・・・

    あとのご判断はお任せします。頑張ってください。


    Shigeru Murai / SIMOZ

    2015年1月6日 3:22