我看到表格上有关复选框的行为看起来很奇怪,而且我想知道是否有其他人遇到它并且可以解释它。
这是表单,绑定到名为FrequencyCodes的表:
虽然表单已绑定,但复选框未绑定。在Form的加载事件中,它们由一个过程填充,该过程读取逗号分隔的字符串(在“CleaningDays”列中),数字来自1-7,相应地选中复选框。这是代码:
Dim ctl As Control For Each ctl In Me.Controls If TypeOf ctl Is CheckBox Then ctl.Value = InStr(1, Me.CleaningDays & ",", Right(ctl.Name, 1) & ",") End If Next ctl
这个想法是,如果选择“每周一次或多次”的模式,则可以选择特定的日期。出于与上面的选项按钮(对于清洁模式)视觉一致性的原因,我添加了一个选项组控件,以便可视化地将复选框组合在一起。我添加了复选框,然后我可以选择多个选项(如果它们是选项组的一部分,显然是不可能的,我从表单中剪切复选框,将它们粘贴到表单上的其他位置,然后将它们拖回到这导致了一组“标准”复选框,可能的值为true或false,而不是选项值1-7或其他任何值,如果它们是选项组的一部分。这是其中一个的属性表:
然后我创建了一些代码,在OK按钮的Click事件中循环显示复选框,并使用其名称的最后一个字符(它们称为chk1-chk7)构建逗号分隔的日期列表当清洁发生时。
以下是代码:
Dim ctl As Control
Dim Output As String
For Each ctl In Me.Controls
If TypeOf ctl Is CheckBox
If (ctl = True) Then
Output = Output & Right(ctl.Name, 1) & ","
End If
End If
Next ctl
If Output <> vbNullString Then
Debug.Print "String calculated was " & Left(Output, Len(Output) - 1)
ReadCheckBoxes = Left(Output, Len(Output) - 1)
Else
ReadCheckBoxes = vbNullString
End If
表单没有按预期工作,所以我做了一些测试。复选框似乎没有按预期返回布尔值(或1和0)。
你可以从上面的截图中看到,在这个特定的测试中,我选择了周一到周五的选项(chk2 - chk6的值应为true)。
然而,这是我在即时窗口中进行一些测试时发现的:
? CHK1
0
?CHK2
-1
?chk3
-1
?chk4
1
? chk5
-1
?chk6
3
?chk7
0
现在,我知道任何非零值都等于true,因此这些值应该有效。但他们不是。我发现点击OK后,只会更正值被记录 - 所以,如果,当表格被加载时,星期一到星期五被勾选,然后我点击星期六然后点击OK,只记录chk7(星期六)被选中。
任何人都可以向我解释这种行为吗?我看不到OptionValue属性,如果这些复选框仍然是选项组的一部分,我希望看到它,但这似乎是返回的值。
谢谢!
答案 0 :(得分:0)
设置复选框值时,不要设置True或False,因为InStr()
会返回字符串位置。
我建议将结果转换为布尔值:
ctl.Value = (InStr(1, Me.CleaningDays & ",", Right(ctl.Name, 1) & ",") > 0)
阅读它们时,为了安全起见:
If (ctl.Value <> False) Then