是否可以在.Net Windows窗体中托管Microsoft Access表单?

Ran*_*ask 9 .net ms-access interop winforms

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

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

因此,我们正在努力改进那里的内容,在这种特殊情况下,如果我们可以以某种方式在.Net Windows窗体中托管Microsoft Access表单,那将非常有用,因为我们可以比.Net的专有硬件更有效地进行交互.我们可以从VB6.

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

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

ta.*_*.is 3

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

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

...您违反了 Access Runtime EULA:

2. 附加许可要求和/或使用权利。

...

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

  • 保持用户界面中显示包含“由 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;
}
Run Code Online (Sandbox Code Playgroud)

它需要 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
Run Code Online (Sandbox Code Playgroud)

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