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

时间:2012-07-19 15:53:04

标签: .net winforms ms-access interop

我在询问是否可以在.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?

表单上的控件

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

简而言之,在我们开始之前,如果......

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

...你正在与Access Runtime EULA发生冲突:

  

<强> 2。附加许可要求和/或使用权利。

     

...

     

<强> II。分发要求。对于您分发的任何可分发代码,您必须......

     
      
  • 保留状态栏,其中包含用户界面中显示的“由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中,似乎缺少创建共享加载项的功能。因人而异。然而,有references to Shared Add-ins in the documentation,所以也许我错过了某些东西,或者功能不在VS 2012 RC中。

答案 2 :(得分:0)

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

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

我知道这是因为我已经完成了。

找出必要的参数等是一件痛苦的痛苦,但只要你不想传递Unicode数据,一旦完成它就会非常顺利。

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

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