2012-02-09 62 views
0

我試圖實現搜索列表框數據,以便與文本框字段一起填充。在MS訪問表中搜索訪問列表框中的數據原樣輸入

我在網上閱讀了幾個文檔和有用的材料,發現以下鏈接對實現我的需求很有用,所以我使用了幾乎相同的代碼,但最終出現了問題。

http://www.opengatesw.net/ms-access-tutorials/Access-Articles/Search-As-You-Type-Access.html

我在我的形式,然後在它100+項「Primary_skill」列表框費爾德,我試圖實現數據自動顯示按照我在表單中輸入TXT箱費爾德搜索。

我在這裏運行的問題,我無法在這裏搜索選擇兩個不同的項目。 (我得到一些錯誤與行Me.refresh在窗體代碼

示例闡述:我想選擇用戶primary_skills是「DB2」和「SQL服務器」,因爲我能夠在內部搜索並選中複選框DB2的,後來我改變搜索TXT我得到錯誤指向me.refresh線調試的「關於改變」事件。

**Form search as-you-type List box code** 

Private Sub btnClearFilter_Click() 
'CODE FOR THE RED "X" BUTTON TO CLEAR THE FILTER AND SHOW ALL 
On Error Resume Next 
10  Me.txtsearch.Value = "" 
20  txtSearch_Change 
End Sub 
Private Sub txtSearch_Change() 
'CODE THAT HANDLES WHAT HAPPENS WHEN THE USER TYPES IN THE SEARCH BOX 
Dim strFullList  As String 
Dim strFilteredList As String 


10 If blnSpace = False Then 
20  Me.Refresh 'refresh to make sure the text box changes are actually available to use 

     'specify the default/full rowsource for the control 
30  strFullList = "SELECT TEMP.Primary_Skill FROM TEMP;" 

     'specify the way you want the rowsource to be filtered based on the user's entry 
40  strFilteredList = "SELECT TEMP.Primary_Skill FROM TEMP WHERE [Primary_Skill] LIKE ""*" & Me.txtsearch.Value & _ 
         "*""" 

     'run the search 
50  fLiveSearch Me.txtsearch, Me.Primary_Skill, strFullList, strFilteredList, Me.txtCount 
60 End If 

End Sub 


Private Sub txtSearch_KeyPress(KeyAscii As Integer) 
'NECESSARY TO IDENTIFY IF THE USER IS HITTING THE SPACEBAR 
'IN WHICH CASE WE WANT TO IGNORE THE INPUT 

10 On Error GoTo err_handle 

20  If KeyAscii = 32 Then 
30   blnSpace = True 
40  Else 
50   blnSpace = False 
60  End If 


70 Exit Sub 
err_handle: 
80 Select Case Err.Number 
      Case Else 
90   MsgBox "An unexpected error has occurred: " & vbCrLf & Err.Description & _ 
       vbCrLf & "Error " & Err.Number & "(" & Erl & ")" 
100 End Select 
End Sub 
Private Sub txtSearch_GotFocus() 
' USED TO REMOVE THE PROMPT IF THE CONTROL GETS FOCUS 
10 On Error Resume Next 
20  If Me.txtsearch.Value = "(type to search)" Then 
30  Me.txtsearch.Value = "" 
40  End If 
End Sub 
Private Sub txtSearch_LostFocus() 
' USED TO ADD THE PROMPT BACK IN IF THE CONTROL LOSES FOCUS 
10 On Error Resume Next 
20  If Me.txtsearch.Value = "" Then 
30  Me.txtsearch.Value = "(type to search)" 
40  End If 

End Sub 


**Modsearach (Module Code):** 

Option Compare Database 
Option Explicit 
'************* Code Start ************** 
' This code was originally written by OpenGate Software 
' It is not to be altered or distributed, 
' except as part of an application. 
' You are free to use it in any application, 
' provided the copyright notice is left unchanged. 
' OpenGate Software http://www.opengatesw.net 

Function fLiveSearch(ctlSearchBox As TextBox, ctlFilter As Control, _ 
         strFullSQL As String, strFilteredSQL As String, Optional ctlCountLabel As Control) 
'================================================================================== 
' THIS FUNCTION ALLOWS YOU TO FILTER A COMBO BOX OR LIST BOX AS THE USER TYPES 
' ALL YOU NEED TO DO IS PASS IN THE CONTROL REFERENCE TO THE SEARCH BOX ON YOUR 
' FORM, THE LISTBOX/COMBO BOX YOU WANT TO FILTER, AND WHAT THE FULL AND FILTERED 
' SQL (ROWSOURCE) SHOULD BE. 
' 
' ctlSearchBox  THE TEXTBOX THE USER TYPES IN TO SEARCH 
' 
' ctlFilter   THE LISTBOX OR COMBOBOX ON THE FORM YOU WANT TO FILTER 
' 
' strFullSQL   THE FULL ROWSOURCE YOU WANT TO DISPLAY AS A DEFAULT IF NO 
'      RESULTS ARE RETURNED 
' 
' strFilteredSQL  THE FILTERED ROWSOURCE FOR THE LISTBOX/COMBOBOX; FOR EXAMPLE 
'      YOU WOULD WANT TO USE '...like ""*" & me.txtsearch.value & "*""" 
'      TO FILTER THE RESULTS BASED ON THE USER'S SEARCH INPUT 
' 
' ctlCountLabel  (OPTIONAL) THE LABEL ON YOUR FORM WHERE YOU WANT TO DISPLAY THE 
'      COUNT OF ROWS DISPLAYED IN THE LISTBOX/COMBOBOX AS THEY SEARCH 
'===================================================================================== 

'ADVANCED PARAMETERS - Change these constants to change the behaviour of the search 
    Const iSensitivity = 1 'Set to the number of characters the user must enter before the search starts 
    Const blnEmptyOnNoMatch = True 'Set to true if you want nothing to appear if nothing matches their search 


10 On Error GoTo err_handle 

      'restore the cursor to where they left off 
20  ctlSearchBox.SetFocus 
30  ctlSearchBox.SelStart = Len(ctlSearchBox.Value) + 1 

40  If ctlSearchBox.Value <> "" Then 
       'Only fire if they've input more than two characters (otherwise it's wasteful) 
50    If Len(ctlSearchBox.Value) > iSensitivity Then 
60     ctlFilter.RowSource = strFilteredSQL 
70     If ctlFilter.ListCount > 0 Then 
80      ctlSearchBox.SetFocus 
90      ctlSearchBox.SelStart = Len(ctlSearchBox.Value) + 1 
100     Else 
110      If blnEmptyOnNoMatch = True Then 
120      ctlFilter.RowSource = "" 
130      Else 
140      ctlFilter.RowSource = strFullSQL 
150      End If 
160     End If 
170    Else 
180    ctlFilter.RowSource = strFullSQL 
190    End If 

200  Else 
210   ctlFilter.RowSource = strFullSQL 
220  End If 

      'if there is a count label, then update it 
      'if there is a count label, then update it 
'230   If IsMissing(ctlCountLabel) = False Then 
'240   ctlCountLabel.Caption = "Displaying " & Format(ctlFilter.ListCount - 1, "#,##0") & " records" 
'250   End If 
260 Exit Function 
err_handle: 
270 Select Case Err.Number 
    Case 91 'no ctlCountLabel 
     'exit 
280  Case 94 'null string 
     'exit 
290  Case Else 
300   MsgBox "An unexpected error has occurred: " & vbCrLf & Err.Description & _ 
      vbCrLf & "Error " & Err.Number & vbCrLf & "Line: " & Erl 
310 End Select 


End Function 
' ***** Code End ****** 

任何想法,我在這裏失蹤。謝謝!

+0

那麼你得到的錯誤是什麼? – ChrisPadgham 2012-02-10 00:04:14

+0

錯誤是 - 運行時錯誤「3058」: 索引或主鍵不能包含NULLvalue。 – Krish212124 2012-02-10 05:09:07

+0

我試圖創建一個簡單的窗體並觀察這種行爲 - 我能夠選擇第一個值,但是當試圖在文本框中輸入一個單詞時第二次窗體正試圖保存記錄調試指向行 ** 20 Me.Refresh「刷新以確保文本框更改實際上可供使用** 可以有人對此問題有任何想法.. **感謝您的回覆克里斯** FYI.My主要技能提交可以」允許多個值「 – Krish212124 2012-02-10 18:57:03

回答

1

首先,不要」如果你想使用一對多的關係,你應該使用連接表來代替。

編輯:您可以在列表框中允許多個值,但是您必須遍歷它才能找到值並將它們分別放入數據庫中,如果您想正確執行此操作。所以我建議避免它,除非你知道你在做什麼或願意更多地瞭解編碼和SQL和東西。

話雖這麼說,這個問題看起來並不涉及已經導入,而是關係到列表框本身的代碼:

什麼是列表框控件源?例如,如果列表框的控件源是單列,則默認情況下它也不能接受多個值。您必須在表單的源表格中更改它。列表框需要與數據庫相匹配:如果數據庫只允許一個值,則列表框必須跟隨,如果數據庫允許多個列表框,則也可以包含它們。

當Me.Refresh運行時,它會導致列表框失去焦點,這意味着訪問將嘗試更新列表框的控件來源。我的猜測是,控制源不能接受多個值並導致觀察到的錯誤。