Excel的VSTO自定义:在多个Excel文件打开的情况下,事件处理程序无法正常工作

时间:2017-08-29 10:21:50

标签: c# .net excel vsto

Excel的文档级VSTO自定义为工作表OnSheetChangeEventHanlder事件注册事件处理程序 - Change

using Excel = Microsoft.Office.Interop.Excel;

public partial class ThisWorkbook
{
    private void InternalStartup()
    {
        this.Open += ThisWorkbookOpen;
    }

    private void ThisWorkbookOpen()
    {
        Excel.Sheets sheets = this.Sheets;
        Excel.Worksheet sheet = null;

        for (int i = 1, length = sheets.Count; i <= length; i++)
        {
            sheet = sheets[i];

            sheet.Change += OnSheetChangeEventHanlder;
        }   

        if (sheet != null) Marshal.ReleaseComObject(sheet);
        if (sheets != null) Marshal.ReleaseComObject(sheets);
    }

    private void OnSheetChangeEventHanlder(Excel.Range Target)
    {
        // ..
    }
}

正如预期的那样,任何时间表数据都会被调用OnSheetChangeEventHanlder。但是,如果我们使用相同的自定义打开两个excel文档并尝试在其中一个中编辑工作表数据,则不会调用OnSheetChangeEventHanlder。它看起来令人困惑,因为它是一个文档级别的自定义,使我期望自定义实例应该彼此隔离。

总结一下:为什么另一个打开的excel文件的存在会阻止事件注册或运行自定义事件处理程序?

1 个答案:

答案 0 :(得分:0)

好吧,我无法解决此问题或找到解释,最后找到了解决方法:在另一个订阅OnSheetChangeEventHandler的事件处理程序中删除并重新附加this.ActivateEvent