访问组合框不在列表事件中未找到添加记录

时间:2017-08-09 03:47:48

标签: ms-access combobox access-vba

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

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

向tblUsers

ID(自动编号),UserCode(文本),用户名(文本)

1,ID00001," Tom Jones"

2,ID00007," Fred Smith"

cmbUsers

RowSource = SELECT UserCode,UserName,ID FROM tblUsers

绑定列= 3

列数= 3

列宽=" 2厘米; 4厘米; 2厘米"

输入掩码" 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使用的是NewData值,而不是" ID"所以永远不会发现值是重新查询的列表!

我尝试将NewData值设置为" ID" &安培;退出前的NewData,但这不起作用。

所以我真的不确定!

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

1 个答案:

答案 0 :(得分:0)

InputMask详细信息

InputMask property的文档说明了关于InputMask属性的第二部分

  

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

示例:

Input Mask: "ID"00000;0;_

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

绑定ComboBox控件的Buggy InputMask行为

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

因此,如果绑定列是文本类型(例如短文本),那么没有问题。但是在原始问题中,绑定字段是Long Integer类型的外键列(控制源:[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]
    • 控制来源:<空白/ null>
    • InputMask:"ID"00000;0;_
    • 行来源:SELECT UserCode, UserName, ID FROM tblUsers
    • 绑定列:3(这与绑定到表单记录源的Control Source属性不同,显然不是导致错误行为的原因)
  3. 使用与之前相同的代码将NotInList事件处理程序添加到未绑定控件。
  4. 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值绑定到数字外键列。
    2. 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