Forms 访问表单:如何映射复选框的值

Forms 访问表单:如何映射复选框的值,forms,oracle,ms-access,checkbox,mapping,Forms,Oracle,Ms Access,Checkbox,Mapping,我有一张甲骨文的桌子。该表有一个包含两个可能值的整数字段:null或1。对于我们的应用程序,null表示false,1表示true 我正在access 2010中为该表创建一个表单。我希望该字段表示为复选框(为1启用,为null禁用) 如果我直接从字段创建复选框,则空值显示为矩形,1正确显示(如选中)。但是,如果我更改复选框的值(矩形->选中,或选中->未选中),并将数据保存到数据库中,则选中的值保存为-1(而不是1),未选中的值保存为0(而不是null) 如果我根据公式创建复选框: Switc

我有一张甲骨文的桌子。该表有一个包含两个可能值的整数字段:null或1。对于我们的应用程序,null表示false,1表示true

我正在access 2010中为该表创建一个表单。我希望该字段表示为复选框(为1启用,为null禁用)

如果我直接从字段创建复选框,则空值显示为矩形,1正确显示(如选中)。但是,如果我更改复选框的值(矩形->选中,或选中->未选中),并将数据保存到数据库中,则选中的值保存为-1(而不是1),未选中的值保存为0(而不是null)

如果我根据公式创建复选框:

Switch(my_field='1','-1',my_field Is Null,'0')
然后正确显示值,但我无法更改复选框状态(选中或取消选中)


我认为应该有一种简单的方法来进行映射,因为这是一种常见的情况,但我找不到方法来进行映射。

解决问题的一种方法是在表单上创建一个隐藏的文本框控件(
.Visible
=
No
)。对于这个示例,我将其称为
txtMyIntAsBoolean
。它绑定到表中可以包含
Null
/
1
值的字段

您的(可见)复选框控件应解除绑定。它是
。值
将是
(真布尔值),取决于是否选中它

现在,您只需要在表单后面添加两行VBA代码。在窗体的当前事件处理程序上创建一个
,并在更新后为复选框创建一个
事件处理程序,代码如下:

选项比较数据库
选项显式
私有子chkMyCheckbox_AfterUpdate()
Me.txtMyIntAsBoolean.Value=IIf(Me.chkMyCheckbox.Value,1,Null)
端接头
私有子表单_当前()
Me.chkMyCheckbox.Value=(不为null(Me.txtMyIntAsBoolean))
端接头

当您移动到新记录时,“当前<代码>事件”更新复选框的值,“更新后<代码>事件”根据复选框的状态将隐藏文本框的值设置为适当的值。

复选框
只能表示

如果必须使用复选框,则必须取消绑定,并且仅当
默认视图
设置为
单一表单
时,该复选框才有效。否则,我建议使用组合框

您将在窗体的当前事件中更新控件的值,并在复选框的更新后更新表中字段的值,如下所示:

Private Sub Form_Current()
    Select Case MyField
    Case 1
        MyCheckbox = True
    Case Null
        MyCheckbox = False
    End Select
End Sub

Private Sub MyCheckbox_AfterUpdate()
    Select Case MyCheckbox
    Case True
        MyField = 1
    Case False
        MyField = Null
    End Select
End Sub

更改复选框返回的存储值并不容易

如果使用表单,workarround将创建一个未绑定复选框并处理AfterUpdate事件。 在这种情况下,可以使用正确的值更新隐藏的有界控件。
在form_Current event中,您可以从隐藏控件更新复选框。

非常有效,谢谢。我认为MS应该(在未来的版本中)添加一种以图形方式进行映射的方法,而不需要添加代码/过程。类似于组合框中的映射(或者更简单,因为组合框中的映射有点棘手)。