Надстройка Excel-DNA выгружается, когда выбрана кнопка «Отменить сохранение». - PullRequest
1 голос
/ 02 апреля 2019

Когда я нажимаю «Файл» -> «Выход» (или Alt + F4) или «Х», мне выдается диалоговое окно «Хотите сохранить изменения», где я могу выбрать «Отмена».Таким образом, Excel можно продолжить, но моя надстройка Excel-днк больше никогда не уведомляется и остается незагруженной.

Image 1

Image 2

Image 3

Заранее спасибо, ребята!

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Армандо!Большое спасибо за вашу помощь!

Я обнаружил, что есть интерфейс IDTExtensibility2, в котором размещаются уведомления о событиях, возникающих в надстройках, например, когда они загружаются, выгружаются, обновляются и т. Д.Поэтому я использую этот интерфейс с классом ExcelComAddIn в пространстве имен ExcelDna.Integration:

public class ExcelComAddIn : IDTExtensibility2
{
    public ExcelComAddIn();

    protected string ProgId { get; }

    public virtual void OnAddInsUpdate(ref Array custom);
    public virtual void OnBeginShutdown(ref Array custom);
    public virtual void OnConnection(object Application, ext_ConnectMode ConnectMode, object AddInInst, ref Array custom);
    public virtual void OnDisconnection(ext_DisconnectMode RemoveMode, ref Array custom);
    public virtual void OnStartupComplete(ref Array custom);
}

Я заметил, что метод OnBeginShutdown () запускается ПОСЛЕ диалогового окна!и это то, что я искал, поэтому я избавился от события WorkbookBeforeClose, переопределил метод OnBeginShutdown () и поместил свой код, который был в событии WorkbookBeforeClose, в OnBeginShutdown () следующим образом:

public override void OnBeginShutdown(ref Array custom)
{
    base.OnBeginShutdown(ref custom);

    //I PUT MY CUSTOM CODE HERE:
    CloseAllPanes();

    ExcelTaskExecutor.Destroy();
}

И теперь, если пользователь выбирает нажать «отмена» в диалоговом окне сохранения, OnBeginShutdown () не запускается, и мои панели все еще там!

В любом случае, ваши подходы очень крутые, и если это не такс вашей помощью у меня никогда не было возможности выяснить, что происходит, и спасибо, что помогли мне найти это решение.

0 голосов
/ 05 апреля 2019

Насколько я понимаю, проблема возникает, когда WorkbookBeforeClose выполняется до того, как пользователь нажимает кнопку отмены.Есть несколько альтернатив.

Самый простой - вы можете сохранить активную рабочую книгу в событии WorkbookBeforeClose (объект woorkbook имеет методы save и saveas save ).Поскольку рабочая книга уже сохранена, диалоговое окно сохранения не будет отображаться, и пользователь не нажмет кнопку отмены.

Другое решение заключается в вызове пользовательского диалогового окна сохранения в WorkbookBeforeClose.Я использовал следующий код в других проектах.WorkbookBeforeClose может выглядеть так:

  private void ActiveWorkbook_BeforeClose(ref bool Cancel)
    {
        DefaultSaveExcel(Excel.ActiveWorkbook,ref Cancel);

        if (!Cancel)
        {
            //if enters here is because the workbook is actually closing
            Delete(Excel.ActiveWorkbook.Name);
        }                     
    }

Реальная реализация DefaultSaveExcel может выглядеть следующим образом:

 public  void DefaultSaveExcel(Workbook wb, ref bool Cancel)
    {
        while (wb.Saved == false && Cancel == false)
        {
            var result = ShowMessageDialogSave();

            if (result == System.Windows.Forms.DialogResult.Yes)
            {
                var sa = CreateExcelSaveDialog(wb.FullName);

                if (sa.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    wb.SaveAs(sa.FileName);
                    wb.Save();

                }
            }
            else if (result == System.Windows.Forms.DialogResult.No)
            {
                wb.Saved = true;
            }
            else if (result == System.Windows.Forms.DialogResult.Cancel)
            {
                Cancel = true;
            }
        }
    }

    public  System.Windows.Forms.SaveFileDialog CreateExcelSaveDialog(string name = null)
    {
        var sa = new System.Windows.Forms.SaveFileDialog();
        sa.Filter = "Excel files (*.xlsx)|*.xlsx";
        if (!string.IsNullOrEmpty(name))
            sa.FileName = name;
        sa.CreatePrompt = true;

        return sa;
    }

    public  DialogResult ShowMessageDialogSave()
    {
        var app = (Microsoft.Office.Interop.Excel.Application)ExcelDna.Integration.ExcelDnaUtil.Application;
        NativeWindow xlMain = new NativeWindow();
        xlMain.AssignHandle(new IntPtr(app.Hwnd));

        var message = "Do you want to save pending changes?";

        if (Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName.ToLower() == "es")
            message = "¿Desea guardar los cambios pendientes?";


        return System.Windows.Forms.MessageBox.Show(xlMain, message, "Microsoft Excel", System.Windows.Forms.MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning,MessageBoxDefaultButton.Button1);
    }

Надеюсь, это поможет, Armando

...