我有一个相对简单的连续表格。有一个看不见的复选框,我们称之为弗兰克。
第二个复选框(Ralph)可能是真或假。还有一个带日期的文本框(RalphDate)。
如果Frank是True,我不希望用户能够更改Ralph或RalphDate,无论其中是什么。
现在,RalphDate很简单,因为我只使用条件格式来检查Frank的值,该值可以启用或禁用RalphDate。此选项不适用于复选框。
我现在卡住了,因为使用一些Visual Basic会根据它遇到的第一个Frank值的值设置所有Ralph框的状态。因此,问题是如何禁用基于Frank Check Box为True的相关Ralph Check Box?
答案 0 :(得分:4)
解决方案1
Locked
属性而不是Enabled
。Locked属性将阻止没有视觉提示的更改。 这应该照顾功能部分,即使在视觉上复选框仍然看起来启用,它也无法更改。
解决方案2
另一种方法是通过这样做来模拟复选框:
=getstate()
”创建一个getstate
函数,其功能类似于:
Public Function GetState() as string
GetState = iif(ckRalph, "V", " ")
End Function
我建议使用符号字体和字符使得勾号在其框中显示得更好 现在,如果您的 Ralph 为真,则复选框将显示勾号,如果不是,则为空。
要完成此操作,请在 Franck 为真时在文本框上使用条件格式将其禁用。
要使点击更逼真,还可以将光标更改为手形指针。
最后需要的是从我们的fakeckRalph
文本框中连接OnClick事件,以便我们可以切换Ralph的状态并正确显示它:
Private Sub OnClick()
Ralph = Not Ralph
fakeckRalph.Requery
End Sub
我使用类似的技术来显示连续表单上的记录是否被锁定(使用其中一种Windings字体的蓝色挂锁符号)或者是否可删除,并且可以单击一个大红叉:
image 2 http://img9.imageshack.us/img9/6296/sshot2do5.png image 1 http://img8.imageshack.us/img8/4997/sshot1ya5.png
答案 1 :(得分:1)
这是连续形式的缺点之一,并且无法绕过它。
一般情况下,我会避免使用可编辑的连续表单 - 我只使用它们来显示列表,并使用链接到连续表单PK的可编辑子表单来显示当前数据以进行编辑。
这避免了条件显示特定控件的所有问题,因为您只是以连续形式显示数据,并且可以精确控制单个细节子表单中可见/启用的内容。
答案 2 :(得分:0)
简短的回答是,如果您使用连续表格,则不能这样做。更改控件的设置会更改所有行。
答案 3 :(得分:0)
将Ralph的控制源设置为函数,例如=GetCheckState()
。然后创建一个这样的函数:
Public Function GetCheckState() as boolean
If Frank then
GetCheckState = True
Else
GetCheckState = False
End If
End Function
这将根据Frank控制是否检查Ralph。由于复选框已绑定到该函数,因此不会让您通过单击更改该值。
要对用户点击该框做出反应,请将代码添加到On Mouse Up事件:
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事件添加类似的代码。
唯一的缺点是:
对于第一点,如果您认为人们会感到困惑,您可以弹出一条解释它的消息。对于第二种,可能有一种解决方法,但我找不到它。即使我在Mouse Down和Mouse Up事件中尝试设置自己的状态消息,该消息仍会显示。
如果禁用该框时灰色显示对您来说非常重要,那么这将无效,但我对接受的答案中建议的“模拟”复选框的外观感觉不满意。这种方法允许我根据其他记录控制复选框的功能,仍然使用实际的复选框。