为啥在循环中更改此标签的 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问题。我明明在属性里设置好了,但运行程序还是不显示,为啥?看图

为啥此代码不会显示 Android 设备方向更改?

使Label Forecolor light透明C#

为啥 CSS3 伪 ::selection 不会更改所有部分的颜色?

怎么更改vb中label标签文字的大小

为啥以及如何在脚本标签中免除同源策略?