【问题标题】:Is it possible to host a Microsoft Access form inside a .Net Windows form?是否可以在 .Net Windows 表单中托管 Microsoft Access 表单?
【发布时间】:2012-07-18 20:40:00
【问题描述】:

我在问是否可以在 .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 的表单上的控件?

【问题讨论】:

  • 这有点像将火箭发动机绑在兴登堡号上。
  • 您甚至可以在 .NET 中添加对 Access 的引用吗?如果是这样,请查看对象浏览器并查看是否有任何控件。我能够添加一个名为 Access 的引用,但它没有附带任何 UI 控件。
  • @CodeSlave 现在有一个想法!
  • @Blam 是的,如果您使用的是 NuGet,您可以直接打开添加引用对话框并搜索 Access,如果不是,您需要在添加引用框中滚动一下才能找到Microsoft.Office.Interop.Access,12.0 让您使用 2007,14.0 让您使用 2010,15.0 让您使用 2013!
  • 如果您托管的是完整版 Access 的表单,也许可以。运行时 EULA 禁止您将其用于数据库功能以外的目的,并且有品牌要求。

标签: .net winforms ms-access interop


【解决方案1】:

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

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

...您违反了 Access Runtime EULA:

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

...

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

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

阅读 EULA(不是那么长)可能是值得的,只是为了了解您可以和不能使用 Access Runtime 的内容。

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

您可能想要反转场景:run your .NET code inside Access

这基本上需要在 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。但是,有 references to Shared Add-ins in the documentation,所以也许我遗漏了一些东西,或者 VS 2012 RC 中没有该功能。

【讨论】:

    【解决方案2】:

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

    您可以通过 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

    【讨论】:

    • 我们对旧的 Access 数据库有相同的想法,但是对 VBA 等的限制对我们来说太多了。并不是说他们为帮助减轻 VBA 功能损失而添加的新功能不合适。相反,VBA 太多了。
    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-18
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多