【问题标题】:Cascading Comboboxes in Access Form Not Showing all available options after selections have been made访问表单中的级联组合框在选择后不显示所有可用选项
【发布时间】:2015-08-27 22:32:15
【问题描述】:

我不完全确定如何通过谷歌或这个网站搜索这个问题,所以如果这是一个重复的问题,让我提前道歉。

我有一个未绑定的访问表单,其中包含 4 个级联组合框,这些组合框是查询的条件,而查询又会创建一个表单,依此类推。级联像我期望的那样完美地工作,并且表单生成就像它应该在单击按钮时一样。但是,我有一个问题,我在一个组合框中进行选择,然后在单独的组合框中进行更改,完整的值列表不再显示在第一个组合框中。如果我单击组合框并退格那里的文本,也会发生同样的事情。
编辑
如果我在 Combobox1 中进行选择,然后重新单击 Combobox1,则只会显示我所做的选择,而不是整个列表。看来我在制作组合框时做错了,但不确定是什么属性控制它。

我正在使用 AfterUpdate 事件重新查询框以使它们级联。所以看起来像

Private Sub Combobox1 AfterUpdate()
Me.Combobox2.Requery
Me.Combobox3.Requery
Me.Combobox4.Requery

并且代码在其他框中重复,这些框也会改变。我想要它,所以如果用户改变主意或点击错误,那么他们可以选择返回并修复它。

编辑

我尝试过的一个解决方案是在 AfterUpdate 事件中也将值设置为 Null。但是我意识到,如果我只需要更改一个选择,我不希望我的其余值消失并重新选择它们。

我还尝试根据要过滤的组合框的单个查询创建联合查询,组合框 1 用于 Query1 的条件等。我创建了它,但联合查询仍然返回所有结果。

编辑2

SELECT tblRawData.[Body No], tblRawData.Supplier, tblRawData.[Part Content], tblRawData.[Defect Desc], tblRawData.DateAdded, Left([tblRawData].[Body No],2) AS ModelCode, tblRawData.ThreePanelStatus, tblRawData.Location, tblRawData.Main, tblRawData.Responsibility2, tblRawData.Responsibility1, tblRawData.[Repair Job1], tblRawData.[Repair Job2], tblRawData.[Trim In Time], tblRawData.[S/OFF Date], tblRawData.[Repair Memo], tblRawData.Responsible, tblRawData.Note
FROM tblRawData
WHERE (((tblRawData.[Body No])=[Forms]![frmTest]![cboChooseBodyNo]) AND ((tblRawData.Supplier)=[Forms]![frmTest]![cboChooseSupplier]) AND ((Left([tblRawData].[Body No],2))=[Forms]![frmTest]![cboChooseModelCode]) AND ((tblRawData.ThreePanelStatus)=[Forms]![frmTest]![cboSelectThreePanelStatus])) OR (((tblRawData.Supplier)=[Forms]![frmTest]![cboChooseSupplier]) AND ((Left([tblRawData].[Body No],2))=[Forms]![frmTest]![cboChooseModelCode]) AND ((tblRawData.ThreePanelStatus)=[Forms]![frmTest]![cboSelectThreePanelStatus]) AND (([Forms]![frmTest]![cboChooseBodyNo]) Is Null)) OR (((tblRawData.[Body No])=[Forms]![frmTest]![cboChooseBodyNo]) AND ((Left([tblRawData].[Body No],2))=[Forms]![frmTest]![cboChooseModelCode]) AND ((tblRawData.ThreePanelStatus)=[Forms]![frmTest]![cboSelectThreePanelStatus]) AND (([Forms]![frmTest]![cboChooseSupplier]) Is Null)) OR (((Left([tblRawData].[Body No],2))=[Forms]![frmTest]![cboChooseModelCode]) AND ((tblRawData.ThreePanelStatus)=[Forms]![frmTest]![cboSelectThreePanelStatus]) AND (([Forms]![frmTest]![cboChooseBodyNo]) Is Null) AND (([Forms]![frmTest]![cboChooseSupplier]) Is Null)) OR (((tblRawData.[Body No])=[Forms]![frmTest]![cboChooseBodyNo]) AND ((tblRawData.Supplier)=[Forms]![frmTest]![cboChooseSupplier]) AND ((tblRawData.ThreePanelStatus)=[Forms]![frmTest]![cboSelectThreePanelStatus]) AND (([Forms]![frmTest]![cboChooseModelCode]) Is Null)) OR (((tblRawData.Supplier)=[Forms]![frmTest]![cboChooseSupplier]) AND ((tblRawData.ThreePanelStatus)=[Forms]![frmTest]![cboSelectThreePanelStatus]) AND (([Forms]![frmTest]![cboChooseBodyNo]) Is Null) AND (([Forms]![frmTest]![cboChooseModelCode]) Is Null)) OR (((tblRawData.[Body No])=[Forms]![frmTest]![cboChooseBodyNo]) AND ((tblRawData.ThreePanelStatus)=[Forms]![frmTest]![cboSelectThreePanelStatus]) AND (([Forms]![frmTest]![cboChooseSupplier]) Is Null) AND (([Forms]![frmTest]![cboChooseModelCode]) Is Null)) OR (((tblRawData.ThreePanelStatus)=[Forms]![frmTest]![cboSelectThreePanelStatus]) AND (([Forms]![frmTest]![cboChooseBodyNo]) Is Null) AND (([Forms]![frmTest]![cboChooseSupplier]) Is Null) AND (([Forms]![frmTest]![cboChooseModelCode]) Is Null)) OR (((tblRawData.[Body No])=[Forms]![frmTest]![cboChooseBodyNo]) AND ((tblRawData.Supplier)=[Forms]![frmTest]![cboChooseSupplier]) AND ((Left([tblRawData].[Body No],2))=[Forms]![frmTest]![cboChooseModelCode]) AND (([Forms]![frmTest]![cboSelectThreePanelStatus]) Is Null)) OR (((tblRawData.Supplier)=[Forms]![frmTest]![cboChooseSupplier]) AND ((Left([tblRawData].[Body No],2))=[Forms]![frmTest]![cboChooseModelCode]) AND (([Forms]![frmTest]![cboChooseBodyNo]) Is Null) AND (([Forms]![frmTest]![cboSelectThreePanelStatus]) Is Null)) OR (((tblRawData.[Body No])=[Forms]![frmTest]![cboChooseBodyNo]) AND ((Left([tblRawData].[Body No],2))=[Forms]![frmTest]![cboChooseModelCode]) AND (([Forms]![frmTest]![cboChooseSupplier]) Is Null) AND (([Forms]![frmTest]![cboSelectThreePanelStatus]) Is Null)) OR (((Left([tblRawData].[Body No],2))=[Forms]![frmTest]![cboChooseModelCode]) AND (([Forms]![frmTest]![cboChooseBodyNo]) Is Null) AND (([Forms]![frmTest]![cboChooseSupplier]) Is Null) AND (([Forms]![frmTest]![cboSelectThreePanelStatus]) Is Null)) OR (((tblRawData.[Body No])=[Forms]![frmTest]![cboChooseBodyNo]) AND ((tblRawData.Supplier)=[Forms]![frmTest]![cboChooseSupplier]) AND (([Forms]![frmTest]![cboChooseModelCode]) Is Null) AND (([Forms]![frmTest]![cboSelectThreePanelStatus]) Is Null)) OR (((tblRawData.Supplier)=[Forms]![frmTest]![cboChooseSupplier]) AND (([Forms]![frmTest]![cboChooseBodyNo]) Is Null) AND (([Forms]![frmTest]![cboChooseModelCode]) Is Null) AND (([Forms]![frmTest]![cboSelectThreePanelStatus]) Is Null)) OR (((tblRawData.[Body No])=[Forms]![frmTest]![cboChooseBodyNo]) AND (([Forms]![frmTest]![cboChooseSupplier]) Is Null) AND (([Forms]![frmTest]![cboChooseModelCode]) Is Null) AND (([Forms]![frmTest]![cboSelectThreePanelStatus]) Is Null)) OR ((([Forms]![frmTest]![cboChooseBodyNo]) Is Null) AND (([Forms]![frmTest]![cboChooseSupplier]) Is Null) AND (([Forms]![frmTest]![cboChooseModelCode]) Is Null) AND (([Forms]![frmTest]![cboSelectThreePanelStatus]) Is Null));

不知道如何让它显示得更干净一些,但有当前正在使用的 SQL。

【问题讨论】:

  • 您使用什么 SQL 来填充组合框?由于它们都是相互关联的,因此很可能这就是问题所在。
  • 同意 jhTuppeny,问题听起来像是在您的组合框的源查询中。您是否使用 4 个单独的记录源?还是一个适合所有 4 个?你能显示查询吗?
  • 我知道这可能不是最有效(或正确)的方式,但一切都基于一个查询。查询基于一个使用 4 个表字段作为条件的表。我相信的 SQL 显示了 4 个组合框可能具有的所有可能组合。这没有得到验证,因为我自己没有输入 SQL。我不知道如何使用 SQL,这也可能是问题的一部分
  • 如果它告诉你什么,SQL 代码的 WHERE 部分有 23 行长以适应
  • 不管是什么问题,它看起来都在 SQL 中。发布这是修复的第一阶段。

标签: ms-access vba ms-access-2010


【解决方案1】:

除了组合框的 AfterUpdate 事件之外,我还添加了一个将重新查询的 LostFocus 事件。现在,当用户返回一个已经有值的组合框并将其删除时,然后单击其他地方,所有想要的值都会显示出来。它可能不是完全证明的,但它现在可以工作。代码如下。

注意:cboChooseBodyNo 没有 AfterUpdate 事件,因为它是在以另一种形式显示结果之前所做的最后一次选择。不需要影响其他组合框中正在发生的事情。

Private Sub cboChooseModelCode_AfterUpdate()
Me.cboChooseBodyNo.Requery
Me.cboSelectThreePanelStatus.Requery
End Sub

Private Sub cboChooseModelCode_LostFocus()
Me.Requery
End Sub

Private Sub cboChooseSupplier_AfterUpdate()
Me.cboChooseBodyNo.Requery
Me.cboSelectThreePanelStatus.Requery
End Sub

Private Sub cboChooseSupplier_LostFocus()
Me.Requery
End Sub

Private Sub cboSelectThreePanelStatus_AfterUpdate()
Me.cboChooseBodyNo.Requery
Me.cboChooseSupplier.Requery
Me.cboChooseModelCode.Requery
End Sub

Private Sub cboSelectThreePanelStatus_LostFocus()
Me.Requery
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多