当用户在组合框的文本框部分输入了不属于组合框列表中的值时,NotInList 事件发生。
Private Sub object_NotInList(NewData As String, Response As Integer)
Object 组合框控件的名称。
NewData 字符串,Microsoft Access 使用该字符串将用户在组合框的文本框部分中输入的文本传递给事件过程。
Response 该设置指示对 NotInList 事件的处理方式。Response 参数可以是以下固有常量之一:
常量说明
acDataErrDisplay(默认值)向用户显示默认信息。当您想禁止用户向组合框列表添加新值时,可以使用此常量。
acDataErrContinue 不向用户显示默认消息。当您要向用户显示自定义消息时,可以使用此常量。例如,事件过程可能会显示一个自定义对话框,询问用户是否要保存新条目。如果回答“是”,则事件过程会将该新条目添加到列表中并将 Response 参数设为 acDataErrAdded。如果回答为“否”,则事件过程会将 Response 参数设为 acDataErrContinue。
acDataErrAdded 不会向用户显示消息,但是却允许您在 NotInList 事件过程中向组合框添加条目。添加条目以后,Microsoft Access 会通过再次查询组合框来更新列表。然后,Microsoft Access 会对照组合框列表重新检查字符串,并将组合框所绑定的字段中的 NewData 参数内的值保存下来。如果列表中没有该字符串,则 Microsoft Access 会显示一条错误信息。
NotInList 事件仅适用于窗体上的控件,不适用于报表上的控件。
若要在该事件发生时执行宏或事件过程,请将 OnNotInList 属性设为宏的名称或 [事件过程]。
LimitToList 属性必须设为“是”,NotInList 事件才能发生。
NotInList 事件不会触发 Error 事件。
输入了非列表值之后、试图将焦点移到另一个控件或保存记录时,LimitToList 属性设为“是”的组合框将发生 NotInList 事件。该事件发生在组合框的所有 Change 事件之后。
当 AutoExpand 属性设为“是”时,Microsoft Access 会选择列表中与用户向组合框的文本框部分输入的字符相匹配的值。如果用户键入的字符与列表中某个值的第一个字符相匹配(例如,用户键入“Smith”,而“Smithson”为列表中的一个值),则当用户移到另一个控件或保存记录时 NotInList 事件不会发生。但是,Microsoft Access 将在用户键入的字符上添加其余字符(在该例中为“son”),并选定该项。如果用户想让 NotInList 事件在这种情况下也发生(例如,用户想要将新名字“Smith”添加到组合框列表),用户可以在新值的最后字符之后输入 Space、Backspace 或 Del。
当 LimitToList 属性设为“是”,并且组合框已被拉下,Microsoft Access 会在用户向组合框的文本框部分输入字符时,在列表中选择匹配的值,甚至当 AutoExpand 属性设为“否”时也一样。如果用户按 Enter 或移到另一个控件或记录,则选定的值将出现在组合框中。在这种情况下,NotInList 事件将不会发生。若要使 NotInList 事件发生,用户不应拉下组合框列表。
可以使用 NotInList 宏向组合框列表添加新值。发生 NotInList 事件时,将打开一个自定义对话框,并将它的一个控件的值设为新值。此控件应绑定到作为组合框数据源的表或查询内的字段。保存自定义对话框中的记录,然后再次查询组合框。
不能在 NotInList 宏中使用 CancelEvent 操作。
下面的示例使用 NotInList 事件向组合框添加内容。
若要尝试此示例,请在窗体上创建名为“Colors”的组合框。将组合框的 LimitToList 属性设为“是”。要填充该组合框,请将组合框的 RowSourceType 属性设为“值列表”,并提供以分号分隔的值列表作为 RowSource 属性的设置。例如,可以提供后面这些值作为该属性的设置:Red; Green; Blue。
然后,将下面的事件过程添加到窗体中。切换到“窗体”视图并在组合框的文本部分输入新值。
Private Sub Colors_NotInList(NewData As String, _
Response As Integer)
Dim ctl As Control
' Return Control object that points to combo box.
Set ctl = Me!Colors
' Prompt user to verify they wish to add new value.
If MsgBox("Value is not in list. Add it?", _
vbOKCancel) = vbOK Then
' Set Response argument to indicate that data
' is being added.
Response = acDataErrAdded
' Add string in NewData argument to row source.
ctl.RowSource = ctl.RowSource & ";" & NewData
Else
' If user chooses Cancel, suppress error message
' and undo changes.
Response = acDataErrContinue
ctl.Undo
End If
End Sub
注意 上面的示例向未绑定的组合框添加了一项内容。在向绑定的组合框添加项时,则会将值添加到基本数据源的字段中。大多数情况下,不能只在新记录中添加一个字段,这取决于表中的数据结构,您可能需要添加一个或多个字段才能满足数据要求。例如,新记录必须包含组成主键的所有字段的值。如果需要以动态方式向绑定的组合框添加项,必须提示用户为所有必需字段输入数据,并保存新记录,然后再次查询组合框以显示新值。