【问题标题】:VSTO Ribbon Button Opens Windows Form But Unable to Use another Instance of Excel without closing the form C#VSTO 功能区按钮打开 Windows 窗体但无法在不关闭窗体 C# 的情况下使用另一个 Excel 实例
【发布时间】:2020-01-12 19:53:02
【问题描述】:

我有一个 VSTO 应用程序,它在功能区上有多个组和按钮。当用户单击按钮时,Excel 上会加载一个特定的表单。看起来当表单打开时,除非表单在第一个实例中关闭,否则用户无法打开另一个 Excel 实例。有没有办法将加载项与不同的实例分开?

我开发的代码使用 getVisbility 回调来决定是否根据特定工作簿在功能区中显示选项卡。但是,这不允许用户在打开 Windows 窗体时使用多个 Excel 实例。一旦我关闭表单 - 一个新的 excel 实例已打开。 VSTO Excel 工具已在应用程序级别开发。

MainRibbon.xml

  <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load">
  <ribbon>
    <tabs>
      <tab idMso="TabAddIns" label="MDS" insertBeforeMso="TabHome" getVisible="setVisbility" >
        <group id="CreateLoadModel"
               label="Create/Load Model">
          <button id="createmodelbutton" label="Create New Model"
             screentip="Text" onAction="OnCreateModel"
             supertip="Create a new Model"
             imageMso="GroupSmartArtCreateGraphic"/>
        <button id="loadmodelbutton" label="Load Existing Model"
             screentip="Text" onAction="OnLoadModel"
             supertip="Load an Exisitng Model"
             imageMso="FileOpen"/>
        </group>

MainRibbon.cs

        public bool setVisbility(Office.IRibbonControl control)
    {
        int nWorkbooks = Globals.ThisAddIn.Application.Workbooks.Count;
        if (nWorkbooks == 0)
        {
            return false;
        }

        if (Globals.ThisAddIn.Application.ActiveWorkbook != null && Globals.ThisAddIn.Application.ActiveWorkbook.Name == "MDS.xlsm")
        {
            return true;
        }
        else
        {
            return false;
        }
    }

AddIn.cs

    private void ThisAddIn_Startup(object sender, EventArgs e)
    {
        this.Application.WorkbookActivate += Application_WorkbookActivate;
        this.Application.WorkbookOpen += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookOpenEventHandler(Application_WorkbookOpen);

    }

    private void Application_WorkbookActivate(Workbook Wb)
    {
        MainRibbon.ribbon.Invalidate();
    }

【问题讨论】:

  • 这些真的是其他实例,还是这些工作簿窗口在同一个实例中打开?我怀疑是后者。 Excel(和其他 Office 应用程序)在同一个应用程序实例中运行多个窗口。在任务管理器中查看列出了多少个 excel.exe 实例。或者在 Excel 的 Windows 菜单中的 View 选项卡下。
  • 抱歉,这些是在同一实例中打开的工作簿窗口!用户是否还有办法打开 Excel 工作簿而不受另一个工作簿中的 Windows 窗体的影响?如果用户打开了表单,但目前想要同时检查另一个工作簿,用户不能在不关闭表单的情况下执行此操作吗?
  • 您能否提供一个代码 sn-p,说明您如何向用户显示表单?

标签: c# excel vsto


【解决方案1】:

如果您在 VSTO 按钮事件处理程序中打开模式对话框,Excel 主线程将被阻塞,并且 Excel 将不会响应用户输入消息。

这还包括尝试打开另一个工作簿。例如,此行为类似于打开“格式化单元格”对话框。

解决方案:

1) 一种不需要编程的快速解决方法是在尝试打开新工作簿时单击 ALT 按钮。 Excel 将显示该消息 要求您打开一个新的 Excel 实例。

2) 另一种方法是在 c# 中打开一个无模式对话框(使用 Show 函数而不是 ShowDialog)。这类似于 Excel 的查找/替换窗口。

请查看以下示例以获取更多详细信息以及如何从此类对话框中获取结果。 https://www.codeproject.com/Articles/27010/Modal-and-Modeless-Dialog-Box-in-C

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多