如何使 Access 组合框中的项目变灰。

How to grey out items in an Access combobox.

我目前正在尝试对 Access 中的组合框进行一些锁定,但我不确定是否可以。表单的流程是用户将select一个部分,然后是区域,然后是过程组。之后将有一个流程步骤中的项目列表。进程组 selection 取决于 selected 的部分和区域。流程步骤基于 selected 哪个流程组。 Process steps selection

我想要实现的是让用户必须按时间顺序浏览列表。有一些步骤不应该在前面的步骤完成之前开始。当前,当用户完成一个步骤时,他们将单击一个运行更新查询的按钮,以将该步骤的 comp_count 状态从 0 更改为 1。 Process Status Table

我不确定我是否可以使用 comp_count 进行锁定,如果可以的话,我怎样才能使列表中的第一项始终 select 可用。此外,我希望下拉列表中的所有项目都可见,但不可用的项目显示为灰色。

你不能把它变灰,但你可以告诉用户不要选择它:

Private Sub myCombo_BeforeUpdate(Cancel As Integer)
If Not Me.myCombo.Column(1) Then
  MsgBox "Do not choose this one yet."
  Cancel = True
End If

我最终找到了一个不太优雅的解决方案,但它确实有效。我向名为 "Check" 的进程状态 table 添加了一列,默认值为 0。然后我创建了一个查询,该查询将更改顺序值为 1 的任何进程的该字段的值. 然后我创建了两个查询来比较 "Comp_Count" 和 "Check"。然后我为我的选择创建了一个更新后事件。

Private Sub Sel_Process_AfterUpdate()
If DCount("*", "qry_process_step_check") = DCount("*", "qry_process_step_check_count") Then
Update_All_Forms
Else
MsgBox ("Previous step/steps not done.")
End If
End Sub

然后我创建了一系列查询,这些查询执行与我用于流程步骤选择的类似检查功能。 Check Query 2 除了这些查询之外,我还创建了一个更新查询。 Update Query

这是不优雅的部分出现的地方。我为每个查询制作了 16 个副本,并更改​​了每个查询的序号。完成后,我更改了按钮的单击事件,该按钮将更新 Process_Status table 中的 "Comp_Count" 字段。 这是使用的代码示例。

Private Sub Refresh_Sign_Offs_Button_Click()
If DCount("*", "qry_verifications_check_count") = DCount("*", "qry_verifications_check") And DCount("*", "qry_sub_verif_check_count") = DCount("*", "qry_Sub_Verif_check") And DCount("*", "qry_measurements_check_count") = DCount("*", "qry_measurements_check") And DCount("*", "qry_equipment_check_count") = DCount("*", "qry_equipment_check") And DCount("*", "qry_kits_check_count") = DCount("*", "qry_kits_check") And DCount("*", "qry_material_check_count") = DCount("*", "qry_material_check") Then
 Me.Completed.Visible = True
 DoCmd.SetWarnings False
 DoCmd.OpenQuery ("qry_update_process_status")
 DoCmd.SetWarnings True
MsgBox ("Process has been completed.")
If DCount("*", "qry_seq1check") = DCount("*", "qry_seq1count") Then
    DoCmd.SetWarnings False
    DoCmd.OpenQuery ("qry_seq1u")
    DoCmd.SetWarnings True


ElseIf DCount("*", "qry_seq2check") = DCount("*", "qry_seq2count") Then
    DoCmd.SetWarnings False
    DoCmd.OpenQuery ("qry_seq2u")
    DoCmd.SetWarnings True
Else
  Me.Completed.Visible = False
  MsgBox ("Not all items filled out.")
End If

上面代码中唯一缺少的是我使用的其余 elseif 语句。这不是最优雅的解决方案,但它会做我需要它做的一切。