命令按钮的单击事件不会针对同一表单中的不同记录进行更新

On Click event for command button doesn't update for different records in same form

我在表单上有一个命令按钮,它可以打开一个单独的表单,仅显示与当前表单的联系人 ID 匹配的新记录。存在第二种形式,因此我可以在我的联系人和新组之间建立关系,这是一种一对多关系,因为每个联系人可以在多个组中,但有些联系人不在任何组中。

有些用户会将现有联系人分配到新组,有些用户会将新联系人添加到现有组,因此我希望在联系人和组之间建立关系的表单独立于联系人表单或小组形式。这就是为什么我不简单地在联系人表单上创建子表单的原因。我不知道我的用户在编辑关系时会来自哪个方向,理想情况下我想建立一个系统,用户来自的表单将使用两个字段之一创建一个新记录(联系人和组)根据 "parent" 形式自动填充。也就是说,如果我的用户正在从联系表单访问关系表单,我将看到一条填写了 ContactID 的新记录,并且我可以 select 一个组。类似地,如果用户从群组表单访问关系表单,该群组将被填写并且用户将 select 一个联系人。

单击联系人表单上的命令按钮时,我有以下子例程:

Private Sub CmdAssignContactGroup_Click()
    DoCmd.OpenForm "frmContacts_Groups", , , , acFormPropertySettings
    [Forms]![frmContacts_Groups]![ContactID] = [Forms]![frmContacts]![ContactID]
End Sub

这适用于任何一个联系人,但是当我在不关闭联系人表单的情况下移动到另一个联系人时,过滤条件保持不变并且命令按钮将我带到所附 contacts/groups 表单中的记录上一个联系人。

在联系表中更改记录后,如何让命令按钮重置?

您的 where 条件与要打开的表单无关,而是与当前打开的表单相关,因为您引用 ContactID[Forms]![frmContacts_Groups]![ContactID]。 IE。您传递了当前打开的表单(TrueFalse)的比较结果,而不是传递将由打开的表单评估的条件。

您必须将条件作为文本传递给它,例如 "ContactID = 10"

Dim condition As String

condition = "ContactID = " & Me!ContactID
DoCmd.OpenForm "frmContacts_Groups", WhereCondition:=condition

由于ContactID在同一个表单上,您可以使用Me!ContactID访问它。看起来您还错误地将条件作为 WindowMode 参数传递。

还要确保 frmContacts_Groups 表单的属性是

AllowEdits = Yes
AllowDeletions = No
AllowAdditions = No

最重要的是!

DataEntry = No

如果DataEntryYes,那么表格会跳转到新的记录!

打开表格前,您也可以调用

DoCmd.Close acForm, "frmContacts_Groups"

确保之前对可能仍处于打开状态的表单所做的编辑不会干扰新的编辑。

此答案使用控件的 DefaultValueLocked 属性 固定 ContactID(如果表单由 frmContacts 打开)或GroupID(如果表单由 frmGroups 打开)到打开表单值。

我假设 frmContacts_Groups 中有两个组合框绑定到它们的 ID,但显示 Client/Group 的名称,名为 cboContactIDcboGroupID .

frmContacts_Groups中的代码:

Private Sub Form_Load()
  Dim OpeningID As Long

  Select Case Me.Openargs
    Case "frmContacts"
      OpeningID = Nz(Forms!frmContacts!ContactID,0)  ' Nz to prevent errors on empty opening form
      Me.Filter = "ContactID = " & OpeningID
      Me.cboContactID.DefaultValue = OpeningID
      Me.cboContactID.Locked = True
      Me.cboGroupID.DefaultValue = vbNullString
      Me.cboGroupID.Locked = False
    Case "frmGroups"
      OpeningID = Nz(Forms!frmGroups!GroupID,0)
      Me.Filter = "GroupID = " & OpeningID
      Me.cboContactID.DefaultValue = vbNullString
      Me.cboContactID.Locked = False 
      Me.cboGroupID.DefaultValue = OpeningID
      Me.cboGroupID.Locked =True 
    Case Else
      Me.cboContactID.DefaultValue = vbNullString
      Me.cboContactID.Locked = False 
      Me.cboGroupID.DefaultValue = vbNullString
      Me.cboGroupID.Locked =False
      Me.Filter = vbNullString
   End Select
   Me.FilterOn = Len(Me.Filter) > 0
End Sub

frmContacts 中打开的代码:

Private Sub CmdAssignContactGroup_Click()
  If Not CurrentProject.AllForms("frmContacts_Groups").IsLoaded then
    DoCmd.OpenForm FormName:="frmContacts_Groups", OpenArgs:="frmContacts"
  Else
    Msgbox "frmContacts_Groups is allready opened! What should we do?"
  End If
End Sub