Microsoft Access,在数据表子表单中自动生成列

ese*_*elk 2 ms-access vba ms-access-2003

我想在 MS Access 2003 中创建一个表单,让用户从任何现有查询中进行选择,然后让它在表单内显示结果(作为数据表视图中的子表单)。然后,用户将能够选择一个或多个记录,并单击父表单上的按钮以根据选择执行某些操作。我希望它能够处理任何查询,只有很少的限制,并显示查询的完整结果(所有列)。我可能有的唯一要求是它包含某些操作的某些字段。例如,如果我有一个“发送电子邮件”操作,则查询将需要一个名为“电子邮件”的字段,或者可能是“收件人”和“主题”。

在运行时更改 DataSheet 子表单的数据源不是问题,我在使用 VBA 之前已经这样做了。让显示的列发生变化是问题所在。

在 .NET WinForms 应用程序中,这可以通过 GridView 控件上的“自动生成列”来完成,或者直接在代码中使用 GridView.Columns 集合。在 VBA 中,我看不到从数据表视图中添加/删除列的方法。我也没有看到一种根据查询自动生成它们的方法。看起来列是由放置在表单上(在表单视图中)的控件控制的,虽然可以使用 VBA 添加/删除控件,但表单必须放置在设计视图中,并且需要对数据库的独占访问权限 - - 听起来很混乱,我想避免独占访问部分。

我错过了什么吗?是否有捷径可寻?

Das*_*ete 5

以下是我的做法。在主窗体上创建一个空白的子窗体控件。要更改源和列,只需将源对象留空,然后当您使用代码设置它时,列将重置为您使用的任何源。所以像这样设置:

Private Sub setSource()
    Me.subForm.SourceObject = "Query.myQuery"
End Sub
Run Code Online (Sandbox Code Playgroud)

然后,要获取所选项目,假设您知道所需的列,您将执行以下操作:

Private Sub getSelected()
    Dim rs As Recordset
    Dim f As Form

    Set f = Me.subForm.Form
    Set rs = f.RecordsetClone

    Debug.Print f.SelTop
    rs.MoveLast
    rs.MoveFirst

    rs.Move f.SelTop - 1
    Debug.Print rs!ID
End Sub
Run Code Online (Sandbox Code Playgroud)

如果您不明确知道该列,则可以使用它循环遍历所选项目的列并对每个名称运行一些分析,直到确定它是您想要的列。

Dim i as Integer
For i = 0 To rs.Fields.Count - 1
        Debug.Print rs.Fields(i).Name
Next
Run Code Online (Sandbox Code Playgroud)