Кнопка ленты VSTO открывает форму Windows, но не может использовать другой экземпляр Excel, не закрывая форму C# - PullRequest
0 голосов
/ 11 января 2020

У меня есть приложение VSTO, которое имеет несколько групп и кнопок на ленте. Когда пользователь нажимает кнопку, в Excel загружается указанная форма c. Похоже, что когда форма открыта, пользователь не может открыть другой экземпляр Excel, если форма не закрыта в первом экземпляре. Есть ли способ отделить надстройку от разных экземпляров?

У меня есть разработанный код, который использует обратный вызов getVisbility, чтобы решить, показывать ли вкладку на ленте на основе указанной c рабочей книги. Однако это не позволяет пользователям использовать несколько экземпляров Excel, пока открыта форма windows. Как только я закрываю форму - открывается новый экземпляр 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();
    }

1 Ответ

1 голос
/ 12 января 2020

Если вы откроете модальное диалоговое окно в обработчике событий кнопки VSTO, основной поток Excel будет заблокирован, и Excel не будет отвечать на сообщения ввода пользователя.

Это также включает попытку открыть другую рабочую книгу. Это поведение аналогично открытию диалогового окна «Формат ячеек», например.

Решения:

1) Быстрый обходной путь, который не требует программирования, - это нажатие кнопки ALT при попытке открыть новую книгу. Excel отобразит сообщение с просьбой открыть новый экземпляр Excel.

2) Другой подход - открыть немодальное диалоговое окно в c# (используя Показать вместо ShowDialog). Это похоже на окно поиска / замены в Excel.

Пожалуйста, посмотрите на следующий пример для получения более подробной информации и как получить результат из такого диалога. https://www.codeproject.com/Articles/27010/Modal-and-Modeless-Dialog-Box-in-C

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...