关于 ms 访问:禁用基于其他值的复选框

Disable Check Box Based on Other Values

我有一个相对简单的连续形式。有一个看不见的复选框,我们就叫它弗兰克吧。

还有第二个复选框 (Ralph),它可能是 True 或 False。还有一个带有日期的文本框 (RalphDate)。

如果 Frank 是 True,我不希望用户能够更改 Ralph 或 RalphDate,无论已经存在什么。

现在,RalphDate 很简单,因为我只需使用条件格式来检查启用或禁用 RalphDate 的 Frank 的值。此选项不适用于复选框。

我现在卡住了,因为使用一些 Visual Basic 会根据遇到的第一个 Frank 值的值将所有 Ralph 框的状态设置为相同。因此,问题是如何根据 Frank Check Box 为 True 仅禁用关联的 Ralph Check Box?


解决方案 1

  • 更新 ckRalph 的 Locked 属性而不是 Enabled
  • 在表单的 OnCurrent() 事件处理程序中执行此操作。

Locked 属性将阻止没有视觉提示的更改。
这应该照顾功能部分,即使在视觉上该复选框仍将看起来已启用,但无法更改。

解决方案 2

另一种方法是通过这样做来模拟复选框:

  • 使用文本框,称之为 fakeckRalph;把它变成一个小正方形。
  • 使其记录源属性类似于 \\'=getstate()\\'
  • 创建一个 getstate 函数,该函数执行以下操作:

    1
    2
    3
    Public Function GetState() as string
        GetState = iif(ckRalph,"V","")
    End Function

我建议使用符号字体和字符来使刻度在其框中显示得更好。
所以现在,如果您的 Ralph 为真,复选框将显示勾号,如果不是,它将为空。

为了完成这个技巧,当 Franck 为真时,使用文本框上的条件格式来禁用它。
为了使点击更加逼真,还将光标更改为手形指针。

最后需要做的是从我们的 fakeckRalph 文本框中连接 OnClick 事件,以便我们可以切换 Ralph 的状态并正确显示它:

1
2
3
4
Private Sub OnClick()
    Ralph = Not Ralph
    fakeckRalph.Requery
End Sub

我使用过类似的技术来显示连续表单上的记录是否被锁定(使用了 Windings 字体中的蓝色挂锁符号)或可删除,并带有一个可以单击的大红叉:

图像 2 http://img9.imageshack.us/img9/6296/sshot2do5.png 图像 1 http://img8.imageshack.us/img8/4997/sshot1ya5.png


这是连续形式的缺点之一,没有办法解决。

一般来说,我避免使用可编辑的连续表单——我只使用它们来显示列表,并使用链接到连续表单的 PK 的可编辑子表单来显示当前数据以进行编辑。

这避免了特定控件的条件显示的所有问题,因为您只需以连续形式显示数据,并且可以准确控制在单个细节子表单中可见/启用的内容。


将Ralph的控制源设置为一个函数,例如=GetCheckState()。然后创建一个这样的函数:

1
2
3
4
5
6
7
Public Function GetCheckState() as boolean
    If Frank then
        GetCheckState = True
    Else
        GetCheckState = False
    End If
End Function

这将根据 Frank 控制是否检查 Ralph。由于复选框绑定到函数,它不会让您通过单击它来更改值。

要对用户单击框做出反应,请将代码添加到 On Mouse Up 事件:

1
2
3
4
5
6
7
Private Sub Ralph_MouseUp(Button As Integer, Shift As Integer, _
    X As Single, Y As Single)
    If Button = acLeftButton And Not Frank Then
        Frank = True
    End If
    Ralph.Requery
End Sub

当控件源是函数时,Click 事件似乎完全被忽略,因此您必须改用 On Mouse Up(如果您愿意,On Mouse Down 也可以使用)。如果您希望该框在用户按下空格键或回车键时检查,您还可以将类似的代码添加到 KeyDown 事件。

唯一的缺点是:

  • 无法单击时,该框不会变灰。
  • Access 将在状态栏中显示一条消息,指出由于单击控件时绑定的表达式,无法编辑控件。

对于第一点,如果您认为人们会感到困惑,您可以弹出一条消息进行解释。对于第二个,可能有办法解决它,但我找不到它。即使我尝试在 Mouse Down 和 Mouse Up 事件中设置自己的状态消息,该消息仍然出现。

如果在禁用时将框设为灰色对您来说非常重要,那么这将不起作用,但我对接受中建议的"模拟"复选框的外观和感觉不满意回答。这种方法允许我根据其他记录控制复选框的功能,并且仍然使用实际的复选框。


简短的回答是,如果您使用连续形式,则不能这样做。更改控件的设置会更改所有行的设置。