【发布时间】:2016-08-12 00:27:28
【问题描述】:
我设置了以下公共功能来帮助我锁定和启用(false)或反之亦然,表单上的特定控件。这样我可以锁定/启用它们,或者我可以解锁并启用 A 组或 B 组,具体取决于所选的组合框。我设置了这个,似乎锁定工作正常,但未启用。
我正在传递要翻转的控件组,然后是一个布尔值来将它们锁定为真或假。这些控件的启用属性应该是布尔变量的逆或非变量。
有人可以看看我可能需要调整什么吗?
Public Function CostModelLock(LockType As String, LockOn As Boolean)
Select Case LockType
Case "A"
'Lock A controls
Forms!frmRequest.AField1.Locked = LockOn
Forms!frmRequest.AField2.Locked = LockOn
Forms!frmRequest.AField3.Locked = LockOn
'Enable A controls
Forms!frmRequest.AField1.Enabled = Not LockOn
Forms!frmRequest.AField2.Enabled = Not LockOn
Forms!frmRequest.AField3.Enabled = Not LockOn
Case "B"
'Lock B controls
Forms!frmRequest.BField1.Locked = LockOn
Forms!frmRequest.BField2.Locked = LockOn
Forms!frmRequest.BField3.Locked = LockOn
'Enable B controls
Forms!frmRequest.BField1.Enabled = Not LockOn
Forms!frmRequest.BField2.Enabled = Not LockOn
Forms!frmRequest.BField3.Enabled = Not LockOn
End Select
Forms!frmRequest.Repaint
End Function
编辑 - 继续:
是的,我正在尝试将其锁定并禁用使其变灰。我可以翻转可见性,但我试图避免这种情况,因此用户可以填写两者,如果它适用,但一次只有一组活动。我希望那些不是他们选择的选项的选项显示为灰色,因此很明显这些字段没有发挥作用。我有一个组合框,这是用户选择他们需要的集合的方式,并且此功能在该组合更新后运行。
在加载表单时,我在两个集合上都运行了这个函数,以确保它们被锁定。那是因为表单加载时没有记录。他们必须使用组合来查找请求,或者单击“新建”来开始新的请求。在更新后,我有以下代码:
If Nz(Me.FKCostModelType.Value) <> 0 Then
If Me.FKCostModelType.Column(0) = 1 Then
Call CostModelLock("A", False)
Call CostModelLock("B", True)
ElseIf Me.FKCostModelType.Column(0) = 2 Then
Call CostModelLock("B", False)
Call CostModelLock("A", True)
End If
ElseIf Nz(Me.FKCostModelType.Value) = 0 Then
Call CostModelLock("A", True)
Call CostModelLock("B", True)
End If
我尝试将功能顺序切换为禁用然后锁定,但这也不起作用。我还将上面的代码添加到查找请求中,以便在找到请求后,正确设置该部分。我已经更新了上面最初发布的代码,添加了一个由 if 语句设置的变量,以设置传递给函数的布尔值的逆,因此我可以更轻松地将相反的布尔值传递给控件。
Public Function CostModelLock(LockType As String, LockOn As Boolean)
Dim NotLockOn As Boolean
If LockOn = True Then
NotLockOn = False
Else
NotLockOn = True
End If
Select Case LockType
Case "A"
'Enable A controls
Forms!frmRequest.AField1.Enabled = NotLockOn
Forms!frmRequest.AField2.Enabled = NotLockOn
Forms!frmRequest.AField3.Enabled = NotLockOn
'Lock A controls
Forms!frmRequest.AField1.Locked = LockOn
Forms!frmRequest.AField2.Locked = LockOn
Forms!frmRequest.AField3.Locked = LockOn
Case "B"
'Enable B controls
Forms!frmRequest.BField1.Enabled = NotLockOn
Forms!frmRequest.BField2.Enabled = NotLockOn
Forms!frmRequest.BField3.Enabled = NotLockOn
'Lock B controls
Forms!frmRequest.BField1.Locked = LockOn
Forms!frmRequest.BField2.Locked = LockOn
Forms!frmRequest.BField3.Locked = LockOn
End Select
Forms!frmRequest.Repaint
End Function
这没什么大不了的。我可能只是删除启用的属性设置,看看我是否可以像启用的属性一样将它们变灰。
感谢大家的回复!从真正擅长这方面的开发人员那里获得建议会很有帮助。
继续:
好的,所以我再次重写了它,但它仍然无法按我的意愿工作,我不确定我做错了什么。下面是公共功能,然后是组合的更新后,用户在其中选择他们想要的模型,该功能会触发以适当地设置 2 组控件。
公共职能代码:
Public Function CostModelLock(TagType As String, LockOn As Boolean)
Dim frm As Form
Dim ctl As Control
Dim bColor As String
Set frm = Forms!frmRequest
If LockOn = True Then
bColor = RGB(192, 192, 192)
Else
bColor = vbWhite
End If
'Loop through every control on the form
For Each ctl In frm.Controls
'Look for a Particular Tag
If ctl.Tag = TagType And (TypeOf ctl Is TextBox Or TypeOf ctl Is ComboBox) Then
ctl.Locked = LockOn
ctl.BackColor = bColor
End If
Next ctl
frm.Repaint
End Function
更新连击后触发公共功能:
Private Sub FKCostModelType_AfterUpdate()
If Nz(Me.FKCostModelType.Value) <> 0 Then
If Me.FKCostModelType.Column(0) = 1 Then
Call CostModelLock("ReqA", False)
Call CostModelLock("ReqB", True)
ElseIf Me.FKCostModelType.Column(0) = 2 Then
Call CostModelLock("ReqB", False)
Call CostModelLock("ReqA", True)
End If
ElseIf Nz(Me.FKCostModelType.Value) = 0 Then
Call CostModelLock("ReqA", True)
Call CostModelLock("ReqB", True)
End If
Call UpdateCostEstimate
End Sub
我还有一个组合代码来查找记录。就是这样:
Private Sub cboFindRequest_AfterUpdate()
Dim ctl As Control
Me.RecordSource = "SELECT * FROM tblRequest"
With Me.RecordsetClone
.FindFirst "ID = " & _
Me.cboFindRequest.Column(0)
If Not .NoMatch Then
Me.Bookmark = .Bookmark
'Set detail, footer and save button visible
Me.Detail.Visible = True
Me.FormFooter.Visible = True
Me.cmdSave.Visible = True
'Set new record and cancel not visible
Me.cmdNew.Visible = False
Me.cmdCancel.Visible = False
'setErr formats red borders around controls, and this is set to false, to remove any red borders
For Each ctl In Forms!frmSoftwareRequest.Controls
setErr ctl, False
Next ctl
'Set focus on first field, so find combo doesn't have focus and can be set to not visible
Me.RequestName.SetFocus
Me.cboFindRequest.Visible = False
Me.Requery
'call the after update function from above
FKCostModelType_AfterUpdate
'call a function to update a calculated control on form
UpdateCostEstimate
End If
End With
End Sub
现在有 2 件事出了问题 - 一个是控件没有正确锁定。我使用组合查找请求,然后向下滚动到组合部分以选择成本模型。当我尝试更改该组合时,会发生第二个问题。我收到一个错误:数据已更改。在您尝试保存更改之前,另一个用户编辑了此记录并保存了更改。重新编辑记录。
呃。我确定我做错了 10 件事,但我似乎无法弄清楚是什么。这个新编辑中的第一个函数(CostModelLock)我认为问题在于我一直在执行 debug.print 等的 frm 和 ctl 调用,但没有看到我期望发生的事情。我可以提供更多信息,但不确定提供什么。非常感谢您的帮助!
【问题讨论】:
-
尝试禁用 then 锁定和解锁 then 启用。
-
请解释什么不是你想要的方式。还要说明这个函数是如何被调用的,以及从哪里调用的。
-
故障排除。将您的功能减少到一行:
Forms!frmRequest.BField3.Enabled = False。那样有用吗?然后从那里扩展。我们真的需要看一点调用这个函数的代码。 -
@JohnBingham:如果您只禁用,该控件将变灰。如果你也锁定,控件会正常显示。
-
@JohnBingham:“只是锁定它做同样的事情”。不,那么控件仍然可以获得焦点。 “..如果它以前是可编辑的,”谁说它是?这一切都取决于。如果你做了大量的开发工作,你会随着时间的推移找到所有四种设置的选项。
标签: ms-access vba boolean case