为啥在循环中更改此标签的 ForeColor 不会明显改变?
Posted
技术标签:
【中文标题】为啥在循环中更改此标签的 ForeColor 不会明显改变?【英文标题】:Why won't the ForeColor of this label visibly change when altered in a loop?为什么在循环中更改此标签的 ForeColor 不会明显改变? 【发布时间】:2017-10-03 20:54:24 【问题描述】:我正在制作一个表单,其中包含一组控件,我想通过相关的切换按钮(我们称它们为组切换)来明显地启用/禁用这些控件。每个组都有不同种类的控制类型,所以我做了一个通用的过程来处理切换:
'constants for control ForeColors
Public Enum LabelForeColor
Default = 8355711
Off = 14277081
End Enum
Public Enum ListForeColor
Default = 4210752
Off = 12566463
End Enum
Public Sub EnableControl(Ctrl As Control, Enabled As Boolean)
With Ctrl
Select Case Ctrl.ControlType
Case acLabel
If Enabled Then .ForeColor = LabelForeColor.Default Else .ForeColor = LabelForeColor.Off
Debug.Print "LABEL", .ForeColor
Case acListBox
If Enabled Then .ForeColor = ListForeColor.Default Else .ForeColor = ListForeColor.Off
.Enabled = Enabled
Debug.Print "LIST", .ForeColor
Case acCommandButton
.Enabled = Enabled
Debug.Print "BUTTON", "NA"
Case acCheckBox
.Enabled = Enabled
Debug.Print "CHECK", "NA"
Case Else
Debug.Print "Control [" & .Name & "] is not of a type that EnableControl can handle."
End Select
End With
End Sub
每组控件都由一个集合表示。加载表单时,每个具有特定标记属性的控件都会添加到相应的集合中。 Group Toggles 不会添加到任何集合中,而是具有如下所示的事件过程:
Private Sub ToggleGroup1_AfterUpdate()
Dim State As Boolean
'a public function that converts the toggle button's value to a boolean
State = FormCommon.ToggleButtonState(ToggleGroup1.Value)
Dim iCtrl As Control
For Each iCtrl In Controls_ByPlant
FormCommon.EnableControl iCtrl, State
Next iCtrl
End Sub
当我单击 GroupToggle 时,相应组中的所有控件都会明显发生相应变化,标签除外。经过一个小时的故障排除,以下是我所知道的:
标签的ForeColor
属性确实发生了变化,但不明显。
当我在循环外的标签上调用EnableControl
时,标签明显改变。
无论我是专门将标签对象传递给子例程还是从它的组集合中传递它都没有关系;在这两种情况下都可以看到变化
如果我在 Group Toggle 事件中切换禁用标签,然后专门在该标签上调用 EnableControl
以尝试再次禁用它,则没有可见的更改(可能是因为 ForeColor
属性已设置到“关闭”颜色)
在 Group Toggle 事件运行时使用 Application.Echo
关闭屏幕更新,然后在事件结束时将其重新打开并没有什么区别。
使用 For i = 1 to .Count
而不是 For Each
运行 Group Toggle 事件并没有什么不同。
当更改其他视觉属性(例如 ForeTint)时也会出现此问题。
(每 cmets)Repaint
没有区别
(每 cmets)DoEvents
没有区别
为什么会这样?
(第一个问题,如果我在帖子中搞砸了,请道歉)
【问题讨论】:
使用条件格式,而不是 VBA。 @June7 我不确定我知道你在说什么。 必应:访问条件格式。 support.office.com/en-us/article/… 我在For Each iCtrl In Me.Controls
循环上运行了您的代码,它适用于所有指定的控件,包括标签。在此处访问 2010。您可以在循环后尝试myForm.Repaint
。你能张贴你的表格截图吗?
@Andre Dropbox link
【参考方案1】:
这很有趣,但有点虎头蛇尾。
您的代码确实适用于标签,但会发生以下情况:
所有标签都与输入控件相关联(与往常一样) 停用组时,会禁用输入控件 (.Enabled = Enabled
)
这会自动将关联标签设置为(系统定义的)浅灰色文本颜色,该颜色无法更改。
此“禁用标签”颜色与您的LabelForeColor.Default
颜色非常相似,因此切换时很难看到变化。但它确实发生了变化。
更改您的颜色常量以使效果更明显:
Public Enum LabelForeColor
Default = vbRed ' 8355711
' the "Off" color is never visible, unless you add an un-associated label to a group
Off = vbBlue ' 14277081
End Enum
编辑:您的测试代码FormCommon.EnableControl iCtrl, False
有效,因为它只影响标签,但不会禁用其关联的列表框。
【讨论】:
以上是关于为啥在循环中更改此标签的 ForeColor 不会明显改变?的主要内容,如果未能解决你的问题,请参考以下文章
c# winform 关于控件forecolor问题。我明明在属性里设置好了,但运行程序还是不显示,为啥?看图