2008-09-17 77 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后端还是服务器后端,这当然都非常有效。尽快将这些效率融入您的应用程序是非常值得的。如果这样做,这使得它更容易升迁到一个服务器后端,或者使得它相当痛苦,如果你应该打新数据的质量,使得旧方法效率太低,是用户友好的那个临界点。