通过弹窗表单添加项后出现NotInList错误的技术问询
问题原因
当触发NotInList事件时,参数NewChar保存的是用户在组合框中最初输入的文本。即便你通过frmAddPersonagem修改了新增记录的内容并成功保存到表中,Access仍会在事件结束后用原始的NewChar值去验证组合框列表,这就导致了"项不在列表中"的错误——此时列表里的是修改后的新值,而非原始输入的NewChar。
另外,你用DMax("IDPersonagem", "tblListaPersonagens")获取新增记录ID的方式存在风险:如果有其他用户同时添加记录,可能会拿到错误的ID。
解决方法
步骤1:修改frmAddPersonagem,返回新增记录的主键ID
在frmAddPersonagem的关闭事件中,把新增记录的主键(IDPersonagem)通过窗体Tag属性传递回子窗体:
Private Sub Form_Close() ' 假设窗体已绑定tblListaPersonagens,Me.IDPersonagem是主键控件 If Not Me.NewRecord Then Me.Tag = Me.IDPersonagem End If End Sub
如果窗体未绑定表,需在手动保存记录后,将生成的主键ID赋值给Me.Tag。
同时可以在窗体加载时,把初始输入值填入编辑框,方便用户修改:
Private Sub Form_Load() If Not IsNull(Me.OpenArgs) Then Me.NomePersonagem = Me.OpenArgs End If End Sub
步骤2:修改子窗体的NotInList事件代码
调整逻辑,直接使用frmAddPersonagem返回的主键ID绑定组合框,绕开Access对原始输入值的验证:
Private Sub cboPersonagem_NotInList(NewChar As String, Response As Integer) Dim ButtonClicked As Integer Dim frm As Form Dim newID As Long ButtonClicked = MsgBox(Prompt:="是否要添加""" & NewChar & """作为新角色?", _ Buttons:=vbYesNo + vbQuestion, Title:="角色不在列表中") If ButtonClicked = vbNo Then cboPersonagem.Undo Response = acDataErrContinue ElseIf ButtonClicked = vbYes Then ' 打开模态窗体,传递初始输入值 DoCmd.OpenForm FormName:="frmAddPersonagem", WindowMode:=acDialog, OpenArgs:=NewChar ' 获取打开的窗体对象 Set frm = Forms("frmAddPersonagem") ' 检查是否成功新增记录 If IsNumeric(frm.Tag) Then newID = CLng(frm.Tag) ' 重新查询组合框列表 Me.cboPersonagem.Requery ' 直接设置组合框为新增记录的主键(需确保组合框绑定列是IDPersonagem) Me.cboPersonagem = newID ' 告知Access已完成新增,无需再验证原始值 Response = acDataErrAdded Else ' 未新增记录则撤销输入 Me.cboPersonagem.Undo Response = acDataErrContinue End If ' 释放窗体对象 Set frm = Nothing End If End Sub
关键注意点
确保cboPersonagem的绑定列设置为IDPersonagem(主键),显示列设置为NomePersonagem,通过主键赋值比文本赋值更可靠,还能避免文本重复的问题。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

