Rebind Access组合框

时间:2008-09-17 07:35:08

标签: ms-access

我有一个可以通过组合框搜索的Access 2007表单。当我添加新记录时,我需要更新组合框以包含新添加的项目。

我认为需要在表单的AfterInsert事件中完成某些操作,但我无法弄清楚是什么。

如何在插入后重新组合组合框以便新项目出现在列表中?

5 个答案:

答案 0 :(得分:1)

最简单的方法是保证组合框始终是最新的,只要在获得焦点后重新查询组合框。即使记录集随后在其他地方更新,您的组合框也始终是最新的。

中,OnFocus事件中的简单TheCombobox.Requery就足够了。

答案 1 :(得分:1)

这里有两个可能有效的答案:

  1. 使用Form的AfterInsert事件来重新查询组合框(以及OnDeleteConfirm事件)。如果组合框不显示用户可以更新的数据,并且如果更新基础记录则需要更新数据,这就足够了。

  2. 如果需要在组合框中反映数据更新,那么在用于编辑组合框中显示的数据的控件的AfterUpdate事件中添加重新查询是有意义的。< / p>

  3. 例如,如果您的组合框列出了表中人物的名称,您将需要使用方法#2,并在Me!txtFirstName和Me!txtLastName的AfterUpdate事件中,重新查询组合框。由于您在四个位置执行相同的操作,因此您需要编写子例程来执行重新查询。所以,子看起来像这样:

      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
    

    上面的代码假设您在显示“LastName,FirstName”的组合框中搜索某个人的姓名。

    还有一个重要的警告:如果您正在搜索绑定到完整表的表单(或返回表中所有记录的SQL语句)并使用Bookmark导航来查找记录,则此方法将无法很好地扩展,因为它需要通过电线拉出搜索字段的整个索引。在上面我想象的组合框的情况下,你将使用FindFirst导航到具有相应MyID值的记录,因此它是必须被拉取的MyID索引(尽管只需要满足索引页面的数量)搜索实际上会被拉扯)。这对于拥有几千条记录的表来说不是问题,但超过大约15-20K,它可能是一个网络瓶颈。

    在这种情况下,您不是通过书签导航,而是使用组合框将结果集过滤到单个记录。无论您使用的是Jet后端还是服务器后端,这当然都非常高效。非常希望尽快将这些效率纳入您的应用程序。如果你这样做,它可以更容易升级到服务器后端,或者如果你应该使用大量新数据来达到这个临界点,这使得旧方法效率太低而无法用户友好,那么它就会变得非常轻松。 / p>

答案 2 :(得分:0)

我认为你的组合框是一个窗体上的控件,而不是commandBar中的组合框控件。这个组合框有一个名为rowsource的属性,可以是值列表(丈夫;妻子;儿子;女孩)或SQL SELECT指令(SELECT relationDescription FROM Table_relationType)。

我还假设你的表单记录集与你的组合框记录集有关。您需要做的是,一旦您的表单记录集正确更新(我认为是更新后的事件),重新初始化组合框控件的rowsource属性

如果recordsource是SQL指令:

myComboBoxControl.recordsource = _
    "SELECT relationDescription FROM Table_relationType"

或者如果是值列表

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

但总的来说,我觉得你的要求很奇怪。你桌子上有反身(亲子)关系吗?

答案 3 :(得分:0)

我通常会使用NotInList事件将数据添加到

的组合中
   Response = acDataErrAdded

更新组合。

Access 2007开发人员参考包含所有详细信息,包括示例代码: http://msdn.microsoft.com/en-us/library/bb214329.aspx

答案 4 :(得分: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