2008-09-17 101 views
1

我有一個可以通過組合框搜索的Access 2007表單。當我添加新記錄時,我需要更新組合框以包含新添加的項目。重新綁定訪問組合框

我認爲需要在表單的AfterInsert事件中完成某些事情,但我無法弄清楚是什麼。

如何在插入後重新綁定組合框,以便新項目出現在列表中?

回答

1

最簡單的方法是確保組合框始終處於最新狀態,只要重新獲得組合框的焦點即可。即使記錄集隨後在其他地方更新,您的組合框始終是最新的。 OnFocus事件中的一個簡單的TheCombobox.Requery應該足夠了。

0

我假設你的組合框是一個窗體上的控件,而不是commandBar中的組合框控件。該組合框有一個名爲rowsource的屬性,可以是值列表(丈夫;妻子;兒子;女孩)或SQL SELECT指令(SELECT relationDescription FROM Table_relationType)。

我還假定您的表單記錄集與您的組合框記錄集有關。什麼你必須做的是,一旦你的形式記錄是正確更新(更新後事件我認爲),重新初始化ComboBox控件

的行來源屬性,如果記錄源是一個SQL指令:

myComboBoxControl.recordsource = _ 
    "SELECT relationDescription FROM Table_relationType" 

,或者如果它是一個值列表

myComboBoxControl.recordsource = myComboBoxControl.recordsource & ";nephew" 

但在所有我覺得你的要求很奇怪。你的桌子上有反身(親子關係)嗎?

0

重新查詢窗體的更新後事件的組合框和刪除事件。只要用戶對記錄集進行更改,無論是新記錄,更改還是刪除,組合框都將保持最新。

除非用戶在製作完成後必須更改其他人的更改,否則每次獲取焦點時都不要重新查詢組合框,因爲用戶不僅需要等待(這對於大型記錄集而言是顯而易見的),如果記錄集沒有改變就沒有必要了。但是如果是這樣的話,只要其他人做出改變,整個表單就需要被重新查詢,而不僅僅是組合框。這將是一個非常不尋常的場景。

更新後:

Private Sub Form_AfterUpdate()  
    On Error GoTo Proc_Err 

    Me.cboSearch.Requery 

    Exit Sub  
Proc_Err:  
    MsgBox Err.Number & vbCrLf & vbCrLf & Err.Description 
    Err.Clear   
End Sub 

後刪除:

Private Sub Form_Delete(Cancel As Integer)  
    On Error GoTo Proc_Err 

    Me.cboSearch.Requery 

    Exit Sub  
Proc_Err:  
    MsgBox Err.Number & vbCrLf & vbCrLf & Err.Description 
    Err.Clear   
End Sub 
1

這裏有兩個可能的答案是有效的:

  1. 使用窗體的AfterInsert事件再次查詢組合框(以及OnDeleteConfirm事件)。如果組合框不顯示用戶可以更新的數據,並且在更新基礎記錄時需要更新,那麼這就足夠了。

  2. 如果對數據的更新需要在組合框中得到體現,那麼它將使意義在用於編輯在組合框中顯示的數據控件的更新後事件添加一個重新查詢。

例如,如果您的組合框列出了表中的人的名字,你會希望使用方法#2,在我AfterUpdate事件!txtFirstName和我!txtLastName,重新查詢組合框。由於您在四個地方執行相同的操作,因此您需要編寫子例程來執行重新查詢。因此,子會是這個樣子:

Private Sub RequerySearchCombo() 
    If Me.Dirty Then Me.Dirty = False 
    Me!MyCombo.Requery 
    End Sub 

的原因,以確保你只有重新查詢時,居然有一個更新在組合框中顯示的數據是因爲如果你用填充組合框中整個表的清單,如果您有1000個記錄的10個,那麼重新查詢可能需要很長時間。

保存所有查詢的另一種方法是爲組合框添加一個空白行來源,並且只有在輸入了1或2個字符後才填充它,並根據輸入的字符過濾組合顯示的結果。對於這一點,你會使用組合框的OnChange事件:

Private Sub MyCombo_Change() 
    Dim strSQL As String 

    If Len(Me!MyCombo.Text) = 2 Then 
    strSQL = "SELECT MyID, LastName & ', ' & FirstName FROM MyTable " 
    strSQL = strSQL & "WHERE LastName LIKE " & Chr(34) & Me!MyCombo.Text & Chr(34) & "*" 
    Me!MyCombo.Rowsource = strSQL 
    End If 
End Sub 

上面的代碼假設你正在尋找一個人的,顯示「姓,名」的組合框的名稱。還有另一個重要的警告:如果您搜索綁定到完整表(或返回表中所有記錄的SQL語句)並使用書籤導航來定位記錄的表單,則此方法不會縮放好吧,因爲它需要在整個線路上搜索搜索字段的整個索引。在我上面的假想組合框的情況下,你會使用的FindFirst導航到具有相應的身份識別碼值的記錄,所以它是針對可能會被拉到(儘管根據需要只因爲許多索引頁,以滿足身份識別碼索引搜索實際上會被拉出)。對於有幾千條記錄的表而言,這不是問題,但超過15-20K時,它可能成爲網絡瓶頸。

在這種情況下,而不是通過書籤導航,您需要使用您的組合框來篩選結果集到的單個記錄。無論您是使用Jet後端還是服務器後端,這當然都非常有效。儘快將這些效率融入您的應用程序是非常值得的。如果這樣做,這使得它更容易升遷到一個服務器後端,或者使得它相當痛苦,如果你應該打新數據的質量,使得舊方法效率太低,是用戶友好的那個臨界點。