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
3Public Function GetState() as string
GetState = iif(ckRalph,"V","")
End Function
我建议使用符号字体和字符来使刻度在其框中显示得更好。
所以现在,如果您的 Ralph 为真,复选框将显示勾号,如果不是,它将为空。
为了完成这个技巧,当 Franck 为真时,使用文本框上的条件格式来禁用它。
为了使点击更加逼真,还将光标更改为手形指针。
最后需要做的是从我们的
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的控制源设置为一个函数,例如 这将根据 Frank 控制是否检查 Ralph。由于复选框绑定到函数,它不会让您通过单击它来更改值。 要对用户单击框做出反应,请将代码添加到 On Mouse Up 事件:
2
3
4
5
6
7
If Frank then
GetCheckState = True
Else
GetCheckState = False
End If
End Function
2
3
4
5
6
7
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 事件中设置自己的状态消息,该消息仍然出现。
如果在禁用时将框设为灰色对您来说非常重要,那么这将不起作用,但我对接受中建议的"模拟"复选框的外观和感觉不满意回答。这种方法允许我根据其他记录控制复选框的功能,并且仍然使用实际的复选框。
简短的回答是,如果您使用连续形式,则不能这样做。更改控件的设置会更改所有行的设置。