【问题标题】:How to iterate through open forms in a VSTO add-in?如何遍历 VSTO 加载项中的打开表单?
【发布时间】:2018-07-30 20:34:10
【问题描述】:

我有一个用于 MS Project 的 VSTO 加载项,它打开表单,其中数据与打开表单时处于活动状态的特定项目文件相关。可以打开与一个项目文件相关的一个表单,同时打开与第二个打开的项目文件相关的另一个不同的表单。

当我关闭一个项目文件时,我想检查每个打开的表单,如果表单基础项目 ID 等于正在关闭的项目文件的项目 ID,则关闭它。如何访问 vsto 应用程序的开放表单集合(或做一些等效的事情)?在 vsto 世界中似乎不存在 Application.OpenForms 对象。

【问题讨论】:

  • 如果这些是 .net 表单,请为打开的表单创建一个集合。每次打开表单时,它都会进入集合,并且每次触发 Project BeforeClose 事件时,在集合中搜索适当的表单并关闭它。
  • 当我尝试使用 FormCollection 对象时,它说它是只读的,并且没有 Add 方法...?
  • 似乎也没有任何“表单”对象。

标签: vsto ms-project


【解决方案1】:

使用Dictionary 对象来存储表单实例以及文件名。每次创建表单时,将其添加到字典中,当项目关闭时,搜索字典以关闭相应的副本。

Friend ProjectForms As New Dictionary(Of String, MyForm)

Friend Sub ShowForm()
    Dim f As New MyForm
    Try
        ProjectForms.Add(ProjApp.ActiveProject.Name, f)
    Catch AlreadyInTheDictionary As Exception
        ' do nothing, it's already in the dictionary
    End Try
    f.Show()
End Sub

将此与应用程序事件(通常是 ThisAddIn)一起放入模块中。

Private Sub Application_ProjectBeforeClose(pj As MSProject.Project, ByRef Cancel As Boolean) Handles Application.ProjectBeforeClose
    ProjectForms(pj.Name).Close()
End Sub

【讨论】:

  • 谢谢。真的希望避免这种情况;似乎拥有一个可访问的本机表单集合是非常标准的,但是哦。
猜你喜欢
  • 2012-07-05
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多