gpt4 book ai didi

c# - 如何迭代 MS-Access 表单上的控件?

转载 作者:行者123 更新时间:2023-11-30 23:25:54 25 4
gpt4 key购买 nike

我有一个方法,给定一个 VBComponent,我可以 Access .Designer 并从那里 Access .Controls 集合:

 private void DeclareControlsAsMembers(VBComponent form)
{
var designer = form.Designer;
if (designer == null)
{
return;
}

// using dynamic typing here, because not only MSForms could have a Controls collection (e.g. MS-Access forms are 'document' modules).
foreach (var control in ((dynamic)designer).Controls)
{
var declaration = new Declaration(_qualifiedName.QualifyMemberName(control.Name), ...);
OnNewDeclaration(declaration);
}
}

此方法的问题在于,当宿主为 MS-Access 时,form.Designernull,因此该方法提前返回。

这里的 dynamic 转换不是特别有用,似乎我可以转换到 UserForm 界面并且它会“正常工作” - 至少在 Excel 中主持人。

但由于 MS-Access 的表单没有设计器(???),如果 C# 代码是 VBE 插件(即只能轻松 Access VBIDE API 提供的任何内容)?

最佳答案

您不能迭代 Access 窗体上的控件,除非窗体处于打开状态。打开表单,即使是设计模式,也是昂贵的,因为需要呈现控件,并且作为 Access,绑定(bind)属性被解析为数据库对象。还有子表单和子报表的问题。

但是,此 VBA 代码将采用您的 vbComponent,打开表单(如果尚未打开,则在设计模式下),然后返回 vbComponent 的 Properties 集合中的控件集合。如果表单一开始未打开,则关闭。

此代码很容易复制到 Access Reports。

Function GetControls() As Access.Controls
Dim comp As VBIDE.VBComponent
Dim proj As VBIDE.VBProject
Dim props As VBIDE.Properties
Dim bCloseFormWhenDone As Boolean
Dim formName As String

Set proj = Application.VBE.ActiveVBProject
Set comp = proj.VBComponents("Form_Form1")
On Error Resume Next
Set props = comp.Properties
On Error GoTo 0

If props Is Nothing Then
bCloseFormWhenDone = True
'The form is not open, so open it in design mode
formName = Mid(comp.Name, 6)
Application.DoCmd.OpenForm formName, acDesign
End If

'Get the controls collection
Set GetControls = comp.Properties("Controls").Object

'Close the form if it wasn't already open
If bCloseFormWhenDone Then
Application.DoCmd.Close acForm, formName
End If

End Function

关于c# - 如何迭代 MS-Access 表单上的控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37079856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com