【问题标题】:MS Access combo box to match existing records if another combo box matches as well如果另一个组合框也匹配,则 MS Access 组合框匹配现有记录
【发布时间】:2015-09-25 22:16:35
【问题描述】:

同一个表中有一个 StreetNumber 字段和一个 StreetName 字段。我想让用户开始在任一字段中输入,当他们在组合框下拉列表中看到现有记录时,他们可以选择它(到目前为止我可以做到这一点)。然后,当他们单击另一个组合框时,它会在第一个组合框中显示所有现有记录,它们也共享相同的信息。

例如,对于这些记录:

--------------------------------------
ID |StreetNumber |StreetName   |Category
1  |10           |Main Street  |House
2  |20           |Main Street  |Apartment
3  |10           |King Street  |Store
4  |11           |Queen Street |Factory
-----------------------------------

当用户输入“1”时,StreetNumber 组合框中将显示“10”和“11”。用户点击 10。在 StreetName 中,用户点击组合框下拉箭头,它只显示“Main Street”和“King Street”。还希望(但可选)它也以另一种方式工作;如果用户先输入“Main Street”,则 StreetNumber 应在下拉菜单中显示“10”和“20”。

额外:如果他们随后在组合框中选择“Main Street”,则选择 ID=1,并且 Category 字段会自动使用“House”填充自身,并在保存时更新 ID=1 而不是创建新的。这如何实现?

这似乎是以前可能做过的事情,但要么我没有使用正确的搜索词,要么没有人使用 Access。

感谢您的帮助!

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    这通常是在组合框的 AfterUpdate 事件中完成的。更新框后,它会触发一个命令来更新以下组合框的源。

    theory 中,您可能会使用某种 If/Then 语句来检查其他组合框值是否为空,然后更新源或不更新。问题是,如果您不使用 If/Then 语句,那么每次您从任一组合中选择某些内容时,它都会刷新另一个组合,您将失去您选择的值。

    所以,让我们假设 2 个组合; cboStreetNumber 和 cboStreetName。在 Form_Load() 事件中,您将加载两个组合:

    cboStreetNumber.RowSource = "SELECT distinct StreetNumber FROM MyTable ORDER BY StreetNumber"
    cboStreetNumber.Requery
    cboStreetName.RowSource = "SELECT distinct StreetName FROM MyTable ORDER BY StreetName"
    cboStreetName.Requery
    

    然后,对于 cboStreetNumber_AfterUpdate() 输入:

    If IsNull(cboStreetName.Value) Then
        cboStreetName.RowSource = "SELECT distinct StreetName FROM MyTable WHERE StreetNumber = '" & Me.cboStreetNumber.Value & "' ORDER BY StreetName"
        cboStreetName.Requery  
    Else
        'No need to change the other combo, it's already been selected.
    End If
    

    对于 cboStreetName_AfterUpdate() 来说:

    If IsNull(cboStreetNumber.Value) Then
        cboStreetNumber.RowSource = "SELECT distinct StreetNumber FROM MyTable WHERE StreetName = '" & Me.cboStreetName.Value & "' ORDER BY StreetNumber"
        cboStreetNumber.Requery  
    Else
        'No need to change the other combo, it's already been selected.
    End If
    

    现在,这完全是“aircode”,可能需要一些调整,但应该非常接近。我要指出的唯一一点是,如果您的街道号码不存储为文本,则不需要在变量 Me.StreetNumber 周围加上单引号。

    缺点是,如果您选择了其中一个,则无法更改它,否则它不会更新另一个框。您需要一个重置按钮或其他东西,这有点笨重。这就是为什么级联下拉菜单通常不能双向工作的原因。 ;o)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 2021-09-05
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多