如何在MS-Access表单上迭代控件?

时间:2016-05-06 19:14:40

标签: c# ms-access vbe vbide

我有一种方法,在.Designer的情况下,我可以访问.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); } } 集合:

form.Designer

此方法的问题在于,当主机为MS-Access时,nulldynamic,因此该方法会提前返回。

此处的UserForm广告投放并不是特别有用,似乎我可以投射到{{1}}界面并且“只是工作” - 至少在Excel主机中。

但由于MS-Access'表单没有设计器(???),我如何在MS-Access表单上迭代控件,给定C#代码是一个VBE加载项(即只能轻松访问VBIDE API提供的任何内容)?

2 个答案:

答案 0 :(得分:2)

除非表单已打开,否则您无法在Access表单上迭代控件。打开表单,甚至是设计模式,都很昂贵,因为需要呈现控件,并且在Access中,绑定的属性被解析为数据库对象。还有子表格和子报告的问题。

但是,这个VBA代码将获取你的vbComponent,打开表单(如果它在设计模式下还没有打开),然后从vbComponent的Properties集合中返回控件集合。如果表格一开始没有打开,那么它就会关闭。

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

    Bundle extras = getIntent().getExtras();
    String xmlfile = null;
    if (extras != null) {
        xmlfile = extras.getString("xmlfile");
    }


    int id = getResources().getIdentifier(xmlfile, "layout", getPackageName());
    setContentView(id);

答案 1 :(得分:0)

导出模块(使用可爱的Application.SaveAsText未记录的功能),并解析内容。 CommandButton看起来像这样:

Begin CommandButton
    OverlapFlags =85
    Left =907
    Top =793
    Width =3118
    Height =1304
    ForeColor =4210752
    Name ="Command0"
    Caption ="Command0"
    OnClick ="[Event Procedure]"
    GUID = Begin
        0x925ed6d615e7594c83313637a6d582f4
    End
    GridlineColor =10921638

    LayoutCachedLeft =907
    LayoutCachedTop =793
    LayoutCachedWidth =4025
    LayoutCachedHeight =2097
    BackColor =15123357
    BorderColor =15123357
    HoverColor =15652797
    PressedColor =11957550
    HoverForeColor =4210752
    PressedForeColor =4210752
    WebImagePaddingLeft =2
    WebImagePaddingTop =2
    WebImagePaddingRight =1
    WebImagePaddingBottom =1
End

您可以检索所有控件的Name属性(以及您喜欢的任何其他属性)的值,甚至可以判断OnClick是否附加到事件处理程序过程。