【问题标题】:Access subform isn't displaying ado recordset访问子窗体不显示 ado 记录集
【发布时间】:2014-02-10 16:16:34
【问题描述】:

我正在尝试在数据表视图的 access07 子窗体中显示 ADO 记录集。只是快照,只读。连接成功,记录集包含数据,但是,当我设置子表单记录集时,没有显示任何字段。子窗体显示一个垂直滚动条,当滚动到底部时它指示正确的记录数,但它什么也不显示,没有字段,没有列。

这必须是我所缺少的非常简单的东西。有什么想法吗?

编辑: 以下是建立记录集的代码摘要。

Set cn = New ADODB.Connection
Set rsADO = New ADODB.Recordset

dbBackend = "C:\Users\Me\Desktop\TEST_Db_Backend.accdb"
sqlStr = "SELECT * FROM tblMaster;"
    strConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbBackend & ";User Id=;Password=;"

    cn.CursorLocation = adUseClient
    cn.ConnectionString = strConnect
    cn.Open
    If cn.State = adStateOpen Then
        rsADO.Open sqlStr, cn, adOpenStatic, adLockReadOnly
End If

    Set Me.PreviewPane.Form.Recordset = rsADO

rsADO.Close
cn.Close
Set rsADO = Nothing
Set cn = Nothing

【问题讨论】:

  • 我用记录集代码更新了我的原始帖子。所以你最初的想法是记录集是原因吗?
  • 此代码是否在Private Sub Form_Load() 事件过程中?如果没有,请尝试将其移到那里并将Set Me.PreviewPane.Form.Recordset = rsADO 更改为Set Me.Recordset = rsADO。我在这里使用了答案:stackoverflow.com/questions/5641760/…
  • 感谢您的建议。不,在表单加载事件中创建记录集后,我仍然收到相同的结果。
  • 哎呀!这让我想起了几年前我们遇到过类似的问题,虽然我们从未找到原因,但我们确实找到了解决方法。不幸的是,时间的迷雾掩盖了确切的解决方案,但我认为我们做了以下事情之一:(a) ...subform.Refresh 或 Repaint 或 Requery; (b) subform.recordset MoveLast 然后 MoveFirst;希望我能记得.... :(
  • 谢谢韦恩。我还在摆弄,会发布我能找到的任何解决方案。

标签: vba ms-access ado recordset subform


【解决方案1】:

经过几个小时的努力,我有了一个可以接受的解决方案,尽管这不是我最初想要的。这是我的答案,我能说的最好的......

ADO 记录集不能直接绑定到数据表视图中的窗体(或子窗体),如果窗体没有控件将记录集中的字段绑定到该窗体。我见过意见相反的资源,但我正在做的事情就是无法让它发挥作用。

为了解决这个问题,我在设计视图中向子表单的源对象表单添加了文本框(带有标签)。添加的文本框的数量是我愿意在子表单中显示的记录集字段的最大数量,因为我的记录集将具有可变数量的字段,我需要动态地将这些文本框分配给它们。

我使用原始帖子中的代码创建了记录集,然后循环通过表单的控件将它们分配给记录集。这是循环:

Const prevMax As Long = 25
Dim r As Long, rMax As Long
Dim ctrl As Object

    rMax = rsADO.Fields.Count - 1
    If rMax > prevMax Then rMax = prevMax
    r = 0
    For Each ctrl In Me.PreviewPane.Form.Controls
        If ctrl.ControlType = acTextBox Then
            If r <= rMax Then
                ctrl.ControlSource = rsADO.Fields(r).Name
                ctrl.Controls(0).Caption = rsADO.Fields(r).Name
                r = r + 1
            Else
                Me.PreviewPane.Form.Controls(ctrl.Name).ColumnHidden = True
            End If
        End If
    Next ctrl

它将每个文本框的 ControlSource 更改为相应的记录集字段,更改标签标题以匹配记录集字段名(在子表单中添加我想要的列名),并隐藏将出现在数据表视图中的剩余文本框列.只要源对象表单的默认视图设置为数据表,它就应该在子表单中显示记录集(在最大值之内)。

【讨论】:

  • 这是一个很好的答案,并且我在许多较早的在线文章中都没有提到对表单控件的需求。你刚刚为我节省了很多时间:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多