【问题标题】:Excel-DNA add-in unloads when"Do you want to save prompt" cancel button is selected选择“是否要保存提示”取消按钮时,Excel-DNA 加载项会卸载
【发布时间】:2019-04-09 01:12:17
【问题描述】:

当我按下 File -> Exit(或 Alt+F4)或 X 时,我会收到“是否要保存更改”对话框的提示,我可以在其中选择“取消”。所以 Excel 可以继续,但我的 excel-dna 加载项永远不会再次收到通知,并且处于卸载状态。

提前谢谢各位!

【问题讨论】:

  • 我刚试过这个,点击取消后我的加载项仍然加载。当然 Excel 不会卸载您的加载项 - 您确定这是正在发生的事情吗?
  • 嗨吉姆!感谢您的答复。使用的是什么版本的 Excel-DNA?
  • 0.34.6。如果您考虑一下,当用户保持 Excel 处于打开状态时,Excel 卸载所有加载项确实是一个错误。为什么你认为它正在卸载你的加载项?这肯定有更多的东西。
  • 是否有可能在代码中某处订阅了 WorkbookBeforeClose 事件?就我而言,即使您单击取消按钮,此事件也会触发。
  • elarmando,你在哪里对!问题是在 WorkbookBeforeClose 中有一些操作可以清除有关侧窗格的所有内容,并且正如您所说,即使我单击取消也会触发。是否有解决方法,在工作表关闭时做一些事情? ...我正在尝试找到一种方法来了解工作簿是否实际上已关闭或类似的解决方法以便设置标志,然后我可以运行我的代码。

标签: c# html excel wpf excel-dna


【解决方案1】:

阿曼多!非常感谢您的帮助!

我发现有一个 IDTExtensibility2 接口托管加载项发生的事件通知,例如加载、卸载、更新等。所以我将该接口与命名空间 ExcelDna.Integration 中的 ExcelComAddIn 类一起使用:

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() 不会运行并且我的窗格仍然存在!

无论如何,你的方法非常酷,如果不是你的帮助,我永远没有机会弄清楚发生了什么,感谢你让我走上正轨找到这个解决方案。

【讨论】:

  • 谢谢,这真的很有帮助
【解决方案2】:

据我了解,在用户单击取消之前执行 WorkbookBeforeClose 时会出现问题。有一些替代方案。

最简单的方法是您可以在 WorkbookBeforeClose 事件中保存活动的工作簿(工作簿对象有一个方法 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);
    }

希望这会有所帮助, 阿曼多

【讨论】:

    猜你喜欢
    • 2022-09-23
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 2018-09-01
    • 2012-02-05
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    相关资源
    最近更新 更多