Excel 的 VSTO 自定义:事件处理程序在打开多个 excel 文件的情况下不起作用
VSTO customization for Excel: event handler not working given multiple excel files are open
Excel 的文档级 VSTO 自定义注册事件处理程序 - OnSheetChangeEventHanlder
- 工作 sheet 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)
{
// ..
}
}
正如预期的那样,只要 sheet 数据发生更改,就会调用 OnSheetChangeEventHanlder
。但是,如果我们打开两个具有相同自定义的 excel 文档并尝试在其中一个中编辑 sheet 数据,则不会调用 OnSheetChangeEventHanlder。它看起来令人困惑,更多的是因为它是文档级自定义,这让我希望自定义实例应该相互隔离。
总结一下:为什么存在另一个打开的 excel 文件会阻止事件注册或 运行 自定义事件处理程序?
好吧,我无法解决这个问题或找到解释,最后找到了一个解决方法:在订阅 this.ActivateEvent
的另一个事件处理程序中删除并重新附加 OnSheetChangeEventHandler
。
Excel 的文档级 VSTO 自定义注册事件处理程序 - OnSheetChangeEventHanlder
- 工作 sheet 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)
{
// ..
}
}
正如预期的那样,只要 sheet 数据发生更改,就会调用 OnSheetChangeEventHanlder
。但是,如果我们打开两个具有相同自定义的 excel 文档并尝试在其中一个中编辑 sheet 数据,则不会调用 OnSheetChangeEventHanlder。它看起来令人困惑,更多的是因为它是文档级自定义,这让我希望自定义实例应该相互隔离。
总结一下:为什么存在另一个打开的 excel 文件会阻止事件注册或 运行 自定义事件处理程序?
好吧,我无法解决这个问题或找到解释,最后找到了一个解决方法:在订阅 this.ActivateEvent
的另一个事件处理程序中删除并重新附加 OnSheetChangeEventHandler
。