做一个带WPF窗体的Access插件-1

时间:2022-09-04 00:29:56
一、关于起因

最近很多的一些小项目使用Access做数据库,其中碰到些很恼火的问题就是给表字段设置默认值。每个数据库的表都比较多并且每个表需要设置默认值的字段又比较多。如果人工去打开表一个个字段去设置确实是吃力不讨好。所以想把默认值放在一个表里面,通过一个插件来操作,完成批量设置。说动手就动手,开发过程中,碰到了好几个问题。

二、问题一

如果用VSTO来做,会发现VSTO里根本没有Access的模板。所以选择使用共享插件模板来开发。那想到VS从2012开始已经没有共享插件模板,所以只好再安装了VS2010来做,共享插件模板再VS2010的位置如下所示。

做一个带WPF窗体的Access插件-1

三、问题二

既然是Access,属于Office下的一个套件,至少得用一下Ribbon吧,结果共享插件里不能像VSTO模板里一样,直接添加带设计视图的Ribbon菜单文件。最后只好采取自己手工添加RibbonXML的方法。

做一个带WPF窗体的Access插件-1

做一个带WPF窗体的Access插件-1

以下是插件的类模块Connect.vb中的代码。其中的Access应用程序对象在插件退出时,做了立即销毁处理,如果不这样处理,可能会造成Access程序退出时,还存在Access应用程序Com对象的引用存在。

 1 Imports Extensibility
 2 Imports System.Runtime.InteropServices
 3 Imports Microsoft.Office.Interop
 4 Imports Microsoft.Office.Core
 5 
 6 #Region " Read me for Add-in installation and setup information. "
 7 ' When run, the Add-in wizard prepared the registry for the Add-in.
 8 ' At a later time, if the Add-in becomes unavailable for reasons such as:
 9 '   1) You moved this project to a computer other than which is was originally created on.
10 '   2) You chose 'Yes' when presented with a message asking if you wish to remove the Add-in.
11 '   3) Registry corruption.
12 ' you will need to re-register the Add-in by building the AccessHelperSetup project, 
13 ' right click the project in the Solution Explorer, then choose install.
14 #End Region
15 
16 <GuidAttribute("CFEFF0B2-8C51-432B-A7B2-478C732A7C64"), ProgIdAttribute("AccessHelper.Connect")> _
17 Public Class Connect
18 
19     Implements Extensibility.IDTExtensibility2
20     Implements IRibbonExtensibility
21 
22     Private mAccApp As Access.Application
23     Private mAddInInstance As Object
24 
25     Public Sub OnBeginShutdown(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnBeginShutdown
26 
27     End Sub
28 
29     Public Sub OnAddInsUpdate(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnAddInsUpdate
30     End Sub
31 
32     Public Sub OnStartupComplete(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnStartupComplete
33     End Sub
34 
35     Public Sub OnDisconnection(ByVal RemoveMode As Extensibility.ext_DisconnectMode, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnDisconnection
36         mAccApp = Nothing
37         mAddInInstance = Nothing
38         GC.Collect()
39         GC.WaitForPendingFinalizers()
40     End Sub
41 
42     Public Sub OnConnection(ByVal application As Object, ByVal connectMode As Extensibility.ext_ConnectMode, ByVal addInInst As Object, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnConnection
43         mAccApp = CType(application, Access.Application)
44         mAddInInstance = addInInst
45     End Sub
46 
47     Public Function GetCustomUI(ByVal RibbonID As String) As String Implements Microsoft.Office.Core.IRibbonExtensibility.GetCustomUI
48         Return My.Resources.RibbonMenuXML
49     End Function
50 
51     ''' <summary>
52     ''' 统一处理所有Ribbon菜单控件的OnAction属性
53     ''' </summary>
54     ''' <param name="control">当前需要回调处理的Ribbon控件</param>
55     ''' <remarks></remarks>
56     Public Sub RibbonAction(ByVal control As IRibbonControl)
57         Select Case control.Id
58             Case Is = "mbtnTableEditor"
59                 'Dim frmTableEditor As New FTableEditor(mAccApp)
60                 'frmTableEditor.Show()
61                 Dim wTblEditor As New WTableEditor(mAccApp)
62                 wTblEditor.Show()
63         End Select
64     End Sub
65 
66 End Class

 

四、问题三

想在插件中使用WPF窗体,而非传统的WinForm。结果发现在为共享插件项目添加新项时,根本没法找到WPF窗体这个项目。只好自己手工建一个VS的项模板,创建自定义的项模板步骤如下所示。

做一个带WPF窗体的Access插件-1

做一个带WPF窗体的Access插件-1

做一个带WPF窗体的Access插件-1

做一个带WPF窗体的Access插件-1

做一个带WPF窗体的Access插件-1

做一个带WPF窗体的Access插件-1