2009-06-25 30 views
1

基本的に私はAddCompanyフォームを持っていますが、そこには[CompanyName]というテキストボックスがあり、そこに新しい会社名を入力しますすでに存在しているものです。アクセス2007年、右上のFacebook名検索ボックスのようなテキストボックス検索ボックス

たとえば、私はMと入力すると、Microsoftと入力します。テキストボックスには、Mと他の名前の束がすべて表示されます。基本的には、Facebookの検索ボックスがどのように機能するかを確認してください。

Microsoft Access 2007でこれを実装するにはどうすればよいですか?それは汚れたイベント/変更/ Onキーダウンイベントにありますか?

私に教えてください!

ありがとうございます!

答えて

0

一般に、この機能は自動補完と呼ばれています(私はあなたのタイプの発見と聞いたことがあります)。 Access on this pageでこれを行う方法の例を示す記事があります。

1

アクセスウィザードでは、同じことをもっと簡単に行うことができます。フォームデザインでフォームウィザードをオンにし、コンボボックスボタンをクリックしてフォームのヘッダー内の場所をポイントすると、リストされているものと一致するレコードを検索するコンボボックスが自動的に作成されますドロップダウンリストに表示されます。

しかし、心の中でこれらの事を保つ:

  1. それは(大レコードセットには推奨されていない)あなたは、テーブル全体にフォームをバインドしました場合にのみ機能します

  2. コードそれ恐ろしいことに悪いです。

この問題を解決するにはいくつかの方法があります。あなたのフォームを表全体にバインドするのがうれしい場合は、(ウィザードで作成したコードのように)ブックマークのナビゲーションは問題ありません。しかし、私はあなたがこのコードの代わりに、ウィザードのコードを使用することをお勧めします(コンボボックスでは、検索しようとしているレコードのPK IDとバインドされた列を持っていると仮定し):

Private Sub MyComboBox_AfterUpdate() 
    If IsNull(Me!MyComboBox) Then Exit Sub 
    With Me.RecordsetClone 
     .FindFirst "[MyID]=" & Me!MyCombBox 
     If Not .NoMatch Then 
     If Me.Dirty Then Me.Dirty = False 
     Me.Bookmark = .Bookmark 
     End If 
    End With 
    End Sub 

コンボボックスがする必要があるでしょうSQLの値集合ソースを使用し、そしてそれはのようになります。

SELECT CompanyID, CompanyName FROM Company ORDER BY CompanyName 

そして、あなたは2列、最初の1バインドされた列を持つようにコンボボックスを定義するだろう、とあなたが最初の列の幅を設定したいですウィザードはこれを行い、あなたのためにセットアップします。それが間違っている唯一のことは、本当に悪いコードを書くことです。

ここで、一意の値を探していない場合は、複雑になり、別のアプローチを使用することもできます。人々を表示し、特定の会社のものを見たいと思うフォームがあるとします。その場合、CompanyNameでフィルタすることができます。その場合、上で概説したようにFind操作を実行する代わりに、フィルターを適用することができます。その場合、あなたのコンボボックスのAfterUpdateイベントは、このようなものになるだろう:会社名および無隠しIDフィールドで、

Private Sub MyComboBox_AfterUpdate() 
    If IsNull(Me!MyComboBox) Then Exit Sub 
    Me.Filter = "[CompanyName]=" & Chr(34) & Me!MyComboBox & Chr(34) 
    Me.FilterOn = True 
    End Sub 

さて、その場合には、あなたのコンボボックスを持っているだろうが、一つの列なので、それはですやや異なっている。

アクセスUIによって提供されているように、この種のフィルタリングをプログラミングするのは嫌いです(CompanyNameフィールドを右クリックしてポップアップするショートカットメニューでフィルタリングする会社名を入力し、ワイルドカード、?と*を含む)。また、フィルタがすでに存在するときにフィルタリングしようとすると、混乱することがあります。 CitiCorpのみを表示しているときにJP Morgan Chaseでフィルタリングすると、何も取得できません。

代わりに、フィルターを適用する代わりにフォームのレコードソースを変更する傾向があります。これは、各検索が新しい結果セットを提供し、最も効率的なアプローチであることを意味します。最初の出発点に戻るという点では少し複雑になりますが、適切に設計されたアプリケーションでは、ユーザーのデータの部分集合のみが最初に提示されるはずです。したがって、このアプローチの問題は、原因は、ユーザーが本当に必要とするデータだけを取得する、適切で効率的なユーザーインターフェイスを構築するために解決する必要があるものです。

0

Accessのフォームには、イベントハンドラ機能があります。したがって、この機能にこれらの機能にオートコンプリートコードを追加することはできませんでしたか?これについて議論しているGoogle Booksに関する本が見つかりました。私は、イベントハンドラ関数を追加する必要があります、次のコードを考えることができ


1. SQL既存の潜在的なマッチに
を見つけるため 2.コードは、潜在的なマッチ

を表示するには、ドロップダウンボックスを生成
関連する問題