You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过弹窗表单添加项后出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:18:23