C# Worksheet.SelectionChange在一段时间后丢失

C# Worksheet.SelectionChange在一段时间后丢失,c#,excel,vsto,C#,Excel,Vsto,在用C开发的VSTO Excel加载项中,我以以下方式创建一个工作表: public void Populate(List<Systems.Models.Producto> productos) { Excel.Workbook workbook = _excelApp.ActiveWorkbook; Excel.Worksheet worksheet = workbook.Sheets.Add(After: workbook.Sheets[workbook.Shee

在用C开发的VSTO Excel加载项中,我以以下方式创建一个工作表:

public void Populate(List<Systems.Models.Producto> productos)
{
    Excel.Workbook workbook = _excelApp.ActiveWorkbook;
    Excel.Worksheet worksheet = workbook.Sheets.Add(After: workbook.Sheets[workbook.Sheets.Count]);
    worksheet.SelectionChange += Worksheet_SelectionChange;
    worksheet.Name = "Inventario";
    // More instructions
}
嗯。。。我注意到,当我选择工作表中的任何单元格时,工作表\u SelectionChange会被调用一段时间。几分钟后,不再调用该事件

起初,我认为拥有方法populate的对象正在被处理。这听起来可能很奇怪,因为该对象也拥有图纸,因此当图纸未关闭时,该对象将处于活动状态。但是,为了以防万一,我已经将拥有该方法的对象声明为全局填充到父对象,但是同样的问题也发生了

任何帮助都将不胜感激。 谢谢


Jaime

您必须在全局作用域中声明源对象,以触发事件并防止垃圾收集器从堆中刷取源对象:

Excel.Workbook workbook = null;
Excel.Worksheet worksheet = null;
public void Populate(List<Systems.Models.Producto> productos)
{
    workbook = _excelApp.ActiveWorkbook;
    worksheet = workbook.Sheets.Add(After: workbook.Sheets[workbook.Sheets.Count]);
    worksheet.SelectionChange += Worksheet_SelectionChange;
    worksheet.Name = "Inventario";
    // More instructions
}

正如您所见,工作表对象是在类级别声明的,而不是在方法级别声明的。这意味着只要类实例存在,就会触发事件。

谢谢。。。我只在班级层面上声明了工作表,它似乎有效。不过我会做更多的测试。我只使用了工作表,因为工作簿不是用该方法创建的实例。它已存在于Active工作簿中。我从不显式创建它,因为当启动Excel并创建新工作表时,也会创建默认工作簿。