【问题标题】:Access Combobox Not In List Event Not finding Added Record访问 Combobox Not In List 事件未找到添加的记录
【发布时间】:2017-08-10 12:41:34
【问题描述】:

当输入的项目不在列表中时,我正在尝试向 ComboxBox 源添加记录。

代码正确创建记录,然后返回 Response = acDataErrAdded 但仍显示错误 Item not in list。如果我随后手动向下滚动列表,新的用户记录就在那里!

tblUsers

ID(自动编号)、用户代码(文本)、用户名(文本)

1,ID00001,“汤姆·琼斯”

2,ID00007,“弗雷德·史密斯”

cmbUsers

RowSource = 从 tblUsers 中选择用户代码、用户名、ID

绑定列 = 3

列数 = 3

列宽 = "2cm;4cm;2cm"

输入掩码“ID00000;;_”

Private Sub cmbUsers_NotInList(NewData as string, Response as integer)
    dim sUserCode as string
    sUserCode = "ID" & NewData ' Doesn't have the "ID" ?!?!?
    if ActiveDirectoryUserIDExists(sUserCode) then
        AddNewUserFromActiveDirectory sUserCode
        Response = acDataErrAdded
        exit sub
    end if
    Response = acDataErrDisplay
End Sub

当输入 NotInList 时,NewData 的值为 00001,并且不以输入掩码“ID”为前缀。

所以我怀疑当 NotInList 子返回时,Access 正在使用未以“ID”开头的 NewData 值,因此永远找不到该值是重新查询的列表!

我尝试在退出前将 NewData 值设置为“ID”和 NewData,但这不起作用。

所以我真的不确定!

关于如何让它发挥作用的任何想法?

【问题讨论】:

  • 好的。我暂时删除了输入掩码,然后它就可以工作了!所以我的怀疑是正确的。我无法删除输入掩码,如何修复 NotInList 事件?
  • 不幸的是,您无法在组合框上调用重新查询。这会导致异常。

标签: ms-access combobox vba


【解决方案1】:

输入掩码详细信息

InputMask property 的文档对 InputMask 属性的 第二部分 这么说:

如果您对此部分使用 0,则所有文字显示字符(例如,电话号码输入掩码中的括号)都与值一起存储;如果您输入 1 或将此部分留空,则仅存储输入到控件中的字符。

例子:

Input Mask: "ID"00000;0;_

应该导致整个文本值,例如"ID00001",在 NewData 参数中传递给 NotInList 事件处理程序。

绑定 ComboBox 控件的错误 InputMask 行为

经过大量测试,似乎这只适用于未绑定的控件。如果控件来源属性中列的数据类型不支持完全保存格式化文本值,然后文本输入值将被格式化为与绑定的字段数据类型兼容(即匹配)即使显示的文本不是实际保存在字段中的内容。这是我能想到的最佳描述,但我找不到任何直接解决此错误的方法。

因此,如果绑定的列是文本类型(例如短文本),则没有问题。但是在原始问题中绑定字段是Long Integer类型的外键列(Control Source:[Assigned User]; Bound Column:3; Row Source有[ID]作为第三列),然后转换输入值在传递给 NotInList 之前转换为数字字符串值。

解决方法

这样可以用最少的代码和一个额外的隐藏 TextBox 控件保留 ComboBox 和 InputMask 的所需行为。

  1. 为具有以下属性的数字外键字段添加一个简单的绑定 TextBox 控件:
    • 控件名称:[Foreign_Key_Column_Name]
    • 控制源:[Foreign_Key_Column_Name]
    • 可见:False
  2. 使用 InputMask 属性和 NotInList 事件处理程序添加未绑定的 ComboBox 控件设置:
    • 控件名称:[X_Foreign_Key_Column_Name]
    • 控制来源:
    • 输入掩码:"ID"00000;0;_
    • 行来源:SELECT UserCode, UserName, ID FROM tblUsers
    • 绑定列:3(这与绑定到表单记录源的控制源属性不同,显然不是导致错误行为的原因)
  3. 使用与以前相同的代码将 NotInList 事件处理程序添加到 unbound 控件。

Private Sub X_Foreign_Key_Column_Name_NotInList(NewData as string, Response as integer)
    dim sUserCode as string
    sUserCode = NewData 
    if ActiveDirectoryUserIDExists(sUserCode) then
        AddNewUserFromActiveDirectory sUserCode
        Response = acDataErrAdded
    Else
        Response = acDataErrDisplay
    end if
End Sub
  1. 添加以下代码以手动将 ComboBox 值绑定到数字外键列。

Private Sub Form_Current()
    Me.X_Foreign_Key_Column_Name.Value = Me.Foreign_Key_Column_Name.Value
End Sub

Private Sub X_Foreign_Key_Column_Name_AfterUpdate()
    Me.Foreign_Key_Column_Name.Value = Me.X_Foreign_Key_Column_Name.Value
End Sub

【讨论】:

  • 不幸的是它没有!文字显示字符不会传递给 NotInList 事件处理程序。
  • 我刚刚测试过了。它对我有用。例如,我得到了Debug.Print NewData -> ID00009
  • 我假设您将 LimitToList 设置为 True。将此语句添加到cmbUsers_NotInList 事件处理程序Debug.Print "InputMask: '" & cmbUsers.InputMask & "'" 的顶部并查看它的输出。它在即时窗口中显示什么?
  • 已经做到了,但它没有在我的身上打印出 ID00009 只是 00009 !!!是的,有 LimitToList = True。输入掩码“ID”00000;0;_
  • 这太令人沮丧了!我想也许输入掩码正在以某种方式被重置。只是为了探索所有可能性,什么版本的 Access?我正在使用 2013。您可以通过使用另一个组合框控件设置一个非常简单的新虚拟数据库来复制该行为吗?
猜你喜欢
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多