Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何使复选框在Access 2010报告中起作用?_Vba_Ms Access_Checkbox_Ms Access 2010 - Fatal编程技术网

Vba 如何使复选框在Access 2010报告中起作用?

Vba 如何使复选框在Access 2010报告中起作用?,vba,ms-access,checkbox,ms-access-2010,Vba,Ms Access,Checkbox,Ms Access 2010,我正在通过MS Access 2010开发一个DB应用程序。 我在报告中添加了一个未绑定的二进制复选框,目的是用户可以为报告的两种变体从两个记录源(查询)中选择一个。 复选框控制源属性为空,三重状态设置为否 然而,在打开报告时, 无论点击多少次,复选框都会永久变灰! 此外,每次单击复选框时,my\u checkbox\u click()将触发两次,其值在Null和True之间切换! 空值似乎被解释为False,如果事件没有在每次单击时双倍激发,这可能是正常的 如何使我的复选框以二进制复选框的形式

我正在通过MS Access 2010开发一个DB应用程序。 我在报告中添加了一个未绑定的二进制复选框,目的是用户可以为报告的两种变体从两个记录源(查询)中选择一个。 复选框
控制源
属性为空,
三重状态
设置为

然而,在打开报告时, 无论点击多少次,复选框都会永久变灰! 此外,每次单击复选框时,
my\u checkbox\u click()
将触发两次,其值在
Null
True
之间切换! 空值似乎被解释为
False
,如果事件没有在每次单击时双倍激发,这可能是正常的

如何使我的复选框以二进制复选框的形式正确显示,在“是”和“否”之间切换,并正确运行,每次单击仅触发一次
\u Click()
? 如果这是一个没有解决方案的已知问题,哪种按钮类型是最佳的解决方法

我的代码:

Private Sub Report_Load()
    Debug.Print vbCrLf & "Report_Load"
    Me.my_chk.Value = False
    set_data_source
End Sub

Private Sub my_chk_Click()
    Debug.Print vbCrLf & "my_chk_Click"
    set_data_source
End Sub

Private Sub set_data_source()
    Debug.Print vbCrLf & "set_data_source"
    Debug.Print "Me.my_chk.Value", Me.my_chk.Value
    Debug.Print "Me.my_chk.ControlSource ", Me.my_chk.ControlSource
    Debug.Print "Me.my_chk.TripleState ", Me.my_chk.TripleState
    Me.RecordSource = IIf(Me.my_chk.Value, "my_yes_qry", "my_no_qry")
    Me.Requery
    Debug.Print "Me.RecordSource", Me.RecordSource
End Sub
即时窗口:

Report_Load

set_data_source
Me.my_chk.Value         False
Me.my_chk.ControlSource         
Me.my_chk.TripleState           False
Me.RecordSource             my_no_qry

' click once on checkbox

my_chk_Click

set_data_source
Me.my_chk.Value         Null
Me.my_chk.ControlSource         
Me.my_chk.TripleState           False
Me.RecordSource             my_no_qry

my_chk_Click

set_data_source
Me.my_chk.Value         -1 
Me.my_chk.ControlSource         
Me.my_chk.TripleState           False
Me.RecordSource             my_yes_qry

' click once on checkbox

my_chk_Click

set_data_source
Me.my_chk.Value         Null
Me.my_chk.ControlSource         
Me.my_chk.TripleState           False
Me.RecordSource             my_no_qry

my_chk_Click

set_data_source
Me.my_chk.Value         -1 
Me.my_chk.ControlSource         
Me.my_chk.TripleState           False
Me.RecordSource             my_yes_qry
唯一的好消息是,
RecordSource
更改后的
Requery
不会正确地(如果过于短暂)影响数据

另一件事,即使我的复选框在
事件
下没有列出
更新后
,如果我用

Private Sub my_chk_AfterUpdate()
    Debug.Print vbCrLf & "my_chk_AfterUpdate"
    set_data_source
End Sub
我明白了

正如您所看到的,这也不起作用,因为现在,即使每次单击都触发一次
AfterUpdate
,复选框值也不会改变

在 有人建议(关于表单,而不是报告)使用花哨的编码

Nz(Me.my_chk = True, False)

我试过了,但结果没有差别。

你确定可以像在表单中一样选中报告上的复选框吗?我不是!但是可以发现一个有趣的可能性

对于窗体,它将灰显,因为它未绑定且未设置值。解决方案是创建一个表单变量并设置为该变量。加载表单时,将变量设置为False,并将复选框设置为变量。在复选框的
AfterUpdate()
事件中,使用控件的值设置变量。然后运行
set\u data\u source
。加载表单时,您可能还需要运行
set\u data\u source

Option Explicit

Dim booSourceUsual as boolean

Private Sub MyForm_Load()
    booSourceUsual = False
    Me!my_chk.Value = booSourceUsual
    Call set_data_source
End Sub

Private Sub my_chk_AfterUpdate()
    booSourceUsual = Me!my_chk.Value
    Call set_data_source
End Sub

我的报告的复选框从不变为灰色。我不知道这是否是一个普遍的真理,为什么会这样,或者我是如何知道的。我尝试了你的建议,但它不起作用(对于一份报告)。“…我是如何知道的…”嘿,我从你的帖子中了解到,一份报告可以有点击事件。总是有些东西需要学习,却从来没有足够的方法去了解。典型的方法是从表格中做出决定。除非我在答案顶部引用的帖子引出了什么,否则我认为这就是你必须要做的。即使是这样,我想我还是要用表格!我想你建议使用表单而不是报表,但我之所以使用报表,是因为它具有简单的子功能。如果报表无法处理用户交互,那么我想我将只使用两个表单(用于两个查询)而不是一个表单。
Option Explicit

Dim booSourceUsual as boolean

Private Sub MyForm_Load()
    booSourceUsual = False
    Me!my_chk.Value = booSourceUsual
    Call set_data_source
End Sub

Private Sub my_chk_AfterUpdate()
    booSourceUsual = Me!my_chk.Value
    Call set_data_source
End Sub