当输入的项目不在列表中时,我尝试将记录添加到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,但这不起作用。
所以我真的不确定!
关于如何让它发挥作用的任何想法?
答案 0 :(得分:0)
InputMask property的文档说明了关于InputMask属性的第二部分:
如果您在此部分使用0,则所有文字显示字符(例如,电话号码输入掩码中的括号)都将与值一起存储;如果输入1或将此部分留空,则仅存储键入控件的字符。
示例:
Input Mask: "ID"00000;0;_
此应该导致整个文本值,例如"ID00001"
,将传递给NewData参数中的NotInList事件处理程序。
经过大量测试后,似乎只能对未绑定的控件进行完美的处理。如果控制源属性中列的数据类型不支持完全保存格式化文本值,然后文本输入值将被格式化为与绑定字段数据类型兼容(即匹配),即使显示的文本不是字段中实际保存的文本。这是我能想到的最好的描述,我找不到任何直接解决这个错误的方法。
因此,如果绑定列是文本类型(例如短文本),那么没有问题。但是在原始问题中,绑定字段是Long Integer类型的外键列(控制源:[Assigned User]; Bound Column:3; Row Source有[ID]作为第三列),然后输入值被转换传递给NotInList之前的数字字符串值。
这样可以使用最少的代码和一个额外的隐藏 TextBox控件来保留ComboBox和InputMask的所需行为。
[Foreign_Key_Column_Name]
[Foreign_Key_Column_Name]
False
[X_Foreign_Key_Column_Name]
"ID"00000;0;_
SELECT UserCode, UserName, ID FROM tblUsers
3
(这与绑定到表单记录源的Control Source属性不同,显然不是导致错误行为的原因)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
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