10

我在问是否可以在 .Net 表单中托管 Microsoft Access 表单。

不,我没有发疯,我们正在维护一个完全用 VBA 编写的庞大系统,该系统由不了解很多 VBA 的人试图将 Microsoft Access 用作 IDE。它基本上是数千行意大利面条代码,虽然我们很想废弃它并从头开始,但这不是一个选择。

因此,我们正在尝试改进现有的内容,在这种特殊情况下,如果我们能够以某种方式将 Microsoft Access 表单托管在 .Net Windows 表单中,那将非常有帮助,因为我们可以更有效地与 .Net 中的专有硬件进行交互我们可以从VB6。

我们目前有一个 .Net 应用程序在计算机上与用户随时打开的许多 MS-Access 数据库一起运行,并且 .Net 应用程序使用 MS Access Interop 与这些数据库进行交互,取得了不同程度的成功。这是因为它使用表单标题和文件名/位置来获取数据库的句柄来完成它需要做的事情,并且还依赖于用户不干扰/关闭应用程序/将数据库移动到他们的桌面等。这是一个有点乱。

因此,我问是否有可能以某种方式在 .Net Windows 表单中托管 Microsoft Access 表单,方法是将表单本身添加为控件或子表单,以使我可以直接访问所有控件在.Net 的表格上?

4

3 回答 3

3

简短的回答是“是”,长的回答是“......但它可能不值得麻烦。”

您可以通过 SharePoint 发布 Access 数据库,包括表单和报表。我实际上并没有这样做,但我研究了一个项目的选项,我们朝着另一个方向前进。

此处的详细信息:http: //office.microsoft.com/en-us/sharepoint-online-enterprise-help/build-and-publish-an-access-database-to-sharepoint-HA102435342.aspx

http://office.microsoft.com/en-us/access-help/introduction-to-integrating-data-between-access-and-a-sharepoint-site-HA010131463.aspx

于 2012-07-20T22:24:11.273 回答
3

顺便说一句,在我们开始之前,如果...

  • 您在问如何在没有应用程序 chrome 的情况下仅托管一个 Access 表单;和
  • 您正在使用 Access 的运行时版本

...您违反了 Access Runtime EULA:

2. 额外的许可要求和/或使用权利。

...

ii. 分发要求。对于您分发的任何可分发代码,您必须...

  • 保持在您的用户界面中显示的包含“Powered by Microsoft Office Access”声明的状态栏供用户随时查看;

阅读 EULA(不是那么长)可能是为了了解您可以和不能使用 Access Runtime 的目的。

因此,我问是否有可能以某种方式在 .Net Windows 表单中托管 Microsoft Access 表单,方法是将表单本身添加为控件或子表单,以使我可以直接访问所有控件在.Net 的表格上?

您可能想要反转场景:在 Access 中运行您的 .NET 代码

这基本上需要在 Visual Studio 中创建一个 Access 可以加载和操作的共享加载项。从那里您可以连接控件和事件。

public void HookupControls(
   Access.CommandButtonClass button,
   Access.ListBoxClass listBox,
   Access.TextBoxClass textBox1,
   Access.TextBoxClass textBox2)
{
    fillProductsButton = button;
    fillProductsButton.Click += 
        new Access.DispCommandButtonEvents_ClickEventHandler(
        fillProductsButton_Click);
    fillProductsButton.OnClick = "[Event Procedure]";

    unitPriceTextBox = textBox1;
    quantityTextBox = textBox2;
}

它需要您的 Access 应用程序的一些合作:

With COMAddIns("SharedAddIn.Connect")
    ''// Make sure the COM add-in is loaded.
    .Connect = True

    ''// Hook up the desired objects.
    .Object.HookupControls Me.fillProductsButton, Me.productsListBox, _
        Me.unitPriceTextBox, Me.quantityTextBox
End With

免责声明:我想尝试一下,但在 Visual Studio 2012 中,似乎缺少创建共享加载项的能力。YMMV。但是,文档中有对共享加载项的引用,所以也许我遗漏了一些东西,或者该功能不在 VS 2012 RC 中。

于 2012-07-21T01:38:12.417 回答
1

我认为你是从错误的方向来的。可以将 .NET 运行时加载到 MS Access 内存空间中。并将您的自定义 .NET DLL 加载到该运行时空间中。

并且通过正确定义的 C 风格 DLL API 层,您可以将调用传播到 .NET 代码中或从 .NET 代码返回。

我知道这一点,因为我已经做到了。

找出必要的参数等是一种痛苦的痛苦,但一旦完成,只要您不希望传递 Unicode 数据,它就相当顺利。

现在,我正在将 150 多个表单和 150 多个报告迁移到 .NET 中。几年后我可能会废弃 Access 端 :)

无论如何,我遇到了这个问题,因为我现在正试图弄清楚如何让 .NET 表单在 Access 中充当适当的 MDI 子级,所以回到狩猎。

于 2018-04-12T10:26:07.843 回答