我有一个比吉利根更简单的方法。看起来工作量很大,但实际上并非如此。我的解决方案需要将我的连续表单作为子表单数据表。在我的子表单上,我有两个查找组合框,以及其他字段,称为设备和制造商。两者都只是在数据源中保存一个 Long Integer 键。制造商需要按设备中选择的内容进行过滤。我过滤 Manufacturer.RowSource 的唯一一次是在 Manufacturer_GotFocus 事件中。
私有子厂商_GotFocus()
If Nz(Me.Equipment, 0) > 0 Then
Me.Manufacturer.RowSource = GetMfrSQL() '- gets filtered query based on Equipment
Else
Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
End If
结束子
在 Manufacturer_LostFocus 中,我也将 Manufacturer.RowSource 重置为所有制造商。您需要这样做,因为当您第一次单击子窗体时,所有控件(包括制造商)都会触发 GotFocus 事件,即使您实际上并未更新任何字段。
私有子制造商_LostFocus()
Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
结束子
在制造商的输入事件中,您必须检查是否选择了设备,如果没有将焦点设置为设备。
私有子制造商_Enter()
If Nz(Me.EquipmentID, 0) = 0 Then
'-- Must select Equipment first, before selecting Manufacturer
Me.Equipment.SetFocus
End If
结束子
您还需要重新查询Form_Current 事件中的Manufacturer 组合框(即Me.Manufacturer.Requery),并且您应该将此子表单的Cycle 属性设置为“当前记录”。
看起来很简单,但你还没有完成。您还必须在父表单的 SubForm_Exit 事件中将 Manufacturer.RowSource 重置为所有制造商,以防用户转到制造商组合框但未进行选择并单击父表单上的某处。代码示例(以父形式):
Private Sub sFrmEquip_Exit(取消为整数)
Me.sFrmEquip.Controls("Manufacturer").RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
结束子
这里面还有一块不干净。当您单击制造商并在数据表网格中有多行时,当您更改当前行中的制造商时,其他行中的制造商字段将变为空白(组合框下方的数据仍然完好无损)。离开此字段后,其他制造商字段中的文本将重新出现。