【问题标题】:option button (radio button) on each record of continuous form连续形式的每条记录上的选项按钮(单选按钮)
【发布时间】:2020-09-01 16:55:56
【问题描述】:

这是针对 MS Access 2016 中的一个项目。我想在以连续形式显示的所有记录之间实现一个单选按钮切换。只有一条记录可以将切换“打开”,因此当单击它时,必须将前一条记录的标志重置为关闭。我只是在单选按钮使用方面寻找帮助,以便从一个记录的多个字段值中进行选择,通常在单个表单上。这个可以吗?

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    单选按钮必须绑定到是/否字段,然后使用 UPDATE 操作 SQL 确保除当前记录之外的所有记录都将字段设置为 0。需要一个唯一的记录标识符字段,例如自动编号。

    Private Sub Option29_Click()
    CurrentDb.Execute "UPDATE tablename SET fieldname = 0 WHERE ID <>" & Me.ID
    End Sub
    

    请注意,在多用户数据库中,用户可能会相互冲突,因此需要另一种解决方案。取决于您需要对所选记录执行什么操作。

    【讨论】:

    • 为了获得更好的性能和多用户行为,请将AND fieldname &lt;&gt; 0 添加到 WHERE 子句中。因此,只有一条现有的“真实”记录被更新,而不是全部更新。
    • June7 & Andre:当我尝试这个解决方案时,我得到错误 3061 too little parameters。
    • 没关系,它现在可以工作了 - 有点,新值保存到数据库中,以前的记录设置为 0,但以前的选项按钮不会被取消选择。
    • 尝试将 Me.Requery 或 Me.Refresh 命令添加到代码中。但是,您会发现这会将重点放在表单的第一条记录上。
    【解决方案2】:

    使用表单的RecordSetClone

    Private Sub Active_AfterUpdate()
    
        Dim Records         As DAO.Recordset
        
        Me.Dirty = False
        
        If Me!Active.Value = True Then
            Set Records = Me.RecordsetClone
            Records.MoveFirst
            
            While Not Records.EOF
                If Records!Id.Value <> Me!Id.Value Then
                    If Records!Active.Value = True Then
                        Records.Edit
                            Records!Active.Value = False
                        Records.Update
                    End If
                End If
                Records.MoveNext
            Wend
    
            Records.Close
        End If
        
    End Sub
    

    【讨论】:

    • 古斯塔夫,这太完美了。像宣传的那样工作。谢谢。
    【解决方案3】:

    您可以轻松做到:

    1- 在您的表格中添加一个新的 Yes/No 字段(例如,名为 CurrentRec)

    2- 放置单选按钮并将其链接到此字段(例如命名为 rdCurrRec)

    3- 对于单选按钮,将“启用”属性设置为 False,将“锁定”属性设置为“真”。这将禁用单击 - 双击和悬停响应。

    4- 输入以下代码

    Dim PreBookmark(4) As Byte   'Save old bookmark
    
    Private Sub Form_Current()
        If Not Me.NewRecord Then  'Make sure not on new record
            Me.rdCurrRec = True
            If (PreBookmark(0) <> 0 Or PreBookmark(1) <> 0 Or PreBookmark(2) <> 0 Or PreBookmark(3) <> 0) Then
                Me.RecordsetClone.Bookmark = PreBookmark
                Me.RecordsetClone.Edit
                Me.RecordsetClone.Fields("CurrentRec") = False
                Me.RecordsetClone.Update
            End If
            PreBookmark(0) = Me.Bookmark(0)
            PreBookmark(1) = Me.Bookmark(1)
            PreBookmark(2) = Me.Bookmark(2)
            PreBookmark(3) = Me.Bookmark(3)
        Else  'If new record remove bullet from previous record
            If (PreBookmark(0) <> 0 Or PreBookmark(1) <> 0 Or PreBookmark(2) <> 0 Or PreBookmark(3) <> 0) Then
                Me.RecordsetClone.Bookmark = PreBookmark
                Me.RecordsetClone.Edit
                Me.RecordsetClone.Fields("CurrentRec") = False
                Me.RecordsetClone.Update
            End If
        End If
    End Sub
    
    Private Sub Form_Close()
        'Remove the mark before exiting to avoid it appear next time to open the form in two places
        If Not Me.NewRecord Then
            If (PreBookmark(0) <> 0 Or PreBookmark(1) <> 0 Or PreBookmark(2) <> 0 Or PreBookmark(3) <> 0) Then
                Me.RecordsetClone.Bookmark = PreBookmark
                Me.RecordsetClone.Edit
                Me.RecordsetClone.Fields("CurrentRec") = False
                Me.RecordsetClone.Update
            End If
        End If
    End Sub
    

    这不会迭代所有数据,因此对于大量记录它不会延迟响应,因为它仅适用于两条记录

    【讨论】:

    • 感谢 mamadsp,但它不是很有效。有几个问题选项按钮即使在悬停时也会被选中,但是当我点击其他任何地方时会被取消选中。当我双击该选项,然后单击同一记录的另一个字段,然后单击另一条记录的选项时,我选择了 2 个选项。此外,即使在表单上选择了一个选项,SQL 表(我正在使用链接表)也不会显示任何更改。
    • 卢卡斯你好。我改进了此处的步骤和代码以消除您面临的问题。此处代码的好处是它只与两条记录而不是所有记录交互,因此对于大量记录,您可以获得相同的性能而没有额外的延迟。希望对你有帮助。
    猜你喜欢
    • 2011-11-24
    • 2018-10-03
    • 2015-10-19
    • 2012-10-24
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多