我有一个可通过组合框搜索的 Access 2007 表单。添加新记录时,我需要更新组合框以包含新添加的项目。
我假设需要在表单的 AfterInsert 事件中完成某些操作,但我不知道是什么。
插入后如何重新绑定组合框,以便新项目出现在列表中?
我有一个可通过组合框搜索的 Access 2007 表单。添加新记录时,我需要更新组合框以包含新添加的项目。
我假设需要在表单的 AfterInsert 事件中完成某些操作,但我不知道是什么。
插入后如何重新绑定组合框,以便新项目出现在列表中?
最简单的方法是保证组合框始终是最新的,只要它获得焦点就重新查询组合框。即使记录集随后在其他地方更新,您的组合框也始终是最新的。OnFocus 事件中的一个简单的 TheCombobox.Requery 就足够了。
这里有两个可能的有效答案:
使用 Form 的 AfterInsert 事件重新查询组合框(以及 OnDeleteConfirm 事件)。如果组合框不显示用户可以更新的数据并且如果基础记录更新则需要更新,这将是足够的。
如果数据的更新需要反映在组合框中,那么在用于编辑组合框中显示的数据的控件的 AfterUpdate 事件中添加重新查询是有意义的。
例如,如果您的组合框列出了表中人员的姓名,您将需要使用方法#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
上面的代码假定您在显示“姓氏,名字”的组合框中搜索一个人的姓名。
还有一个重要的警告:如果您正在搜索绑定到完整表的表单(或返回表中所有记录的 SQL 语句)并使用书签导航来定位记录,则此方法不会很好地扩展,因为它需要通过网络拉出搜索字段的整个索引。在上面我想象的组合框的情况下,您将使用 FindFirst 导航到具有相应 MyID 值的记录,因此必须拉出 MyID 的索引(尽管只有尽可能多的索引页才能满足搜索实际上会被取消)。对于有几千条记录的表来说,这不是问题,但超过 15-20K 条记录时,它可能会成为网络瓶颈。
在这种情况下,您可以使用组合框将结果集过滤到单个记录,而不是通过书签导航。当然,这非常有效,无论您使用的是 Jet 后端还是服务器后端。尽快开始将这些效率整合到您的应用程序中是非常可取的。如果你这样做了,那么升级到服务器后端会变得更容易,或者如果你应该用大量新数据达到那个临界点,这会使旧方法效率太低而对用户友好,那么它就会变得非常轻松。
我假设您的组合框是表单上的控件,而不是命令栏中的组合框控件。此组合框有一个名为 rowsource 的属性,它可以是值列表(丈夫;妻子;儿子;女孩)或 SQL SELECT 指令(SELECT relationshipDescription FROM Table_relationType)。
我还假设您的表单记录集与您的组合框记录集有关。您需要做的是,一旦您的表单记录集被正确更新(我认为是 afterUpdate 事件),重新初始化组合框控件的 rowsource 属性
如果记录源是一条 SQL 指令:
myComboBoxControl.recordsource = _
"SELECT relationDescription FROM Table_relationType"
或者如果它是一个值列表
myComboBoxControl.recordsource = myComboBoxControl.recordsource & ";nephew"
但总的来说,我觉得你的要求很奇怪。你的桌子上有自反(父子)关系吗?
我通常会使用 NotInList 事件将数据添加到组合中
Response = acDataErrAdded
更新组合。
Access 2007 开发人员参考包含所有详细信息,包括示例代码:http: //msdn.microsoft.com/en-us/library/bb214329.aspx
重新查询表单的更新后事件和删除事件中的组合框。每当用户对记录集进行更改时,无论是新记录、更改还是删除,您的组合框都会保持最新状态。
除非用户必须在完成后立即获得其他所有人的更改,否则不要在每次获得焦点时重新查询组合框,因为不仅用户必须等待(这对于大型记录集而言很明显),如果记录集没有改变。但如果是这种情况,则需要在其他任何人进行更改时重新查询整个表单,而不仅仅是组合框。这将是一个非常不寻常的情况。
更新后:
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