Worksheet.SelectionChange 一段时间后迷路
Worksheet.SelectionChange get lost after some time
在用 C# 开发的 Excel 的 VSTO 插件中,我正在以这种方式创建 sheet:
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
}
嗯...我注意到当我 select sheet 中的任何单元格时 Worksheet_SelectionChange
被调用了一会儿。几分钟后,该事件不再被调用。
起初,我以为拥有方法 populate
的对象正在被释放。这听起来可能很奇怪,因为该对象还拥有 sheet,因此当 sheet 未关闭时,该对象将处于活动状态。但是,为了以防万一,我把拥有populate
方法的对象全局声明给了父对象,但是还是出现了同样的问题
如有任何帮助,我们将不胜感激。
谢谢
海梅
您必须在全局范围内声明源对象才能触发事件并防止源对象被垃圾收集器从堆中清除:
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
}
如您所见,worksheet
对象是在 class 级别声明的,而不是方法。这意味着只要 class 实例存在,您就会触发事件。
在用 C# 开发的 Excel 的 VSTO 插件中,我正在以这种方式创建 sheet:
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
}
嗯...我注意到当我 select sheet 中的任何单元格时 Worksheet_SelectionChange
被调用了一会儿。几分钟后,该事件不再被调用。
起初,我以为拥有方法 populate
的对象正在被释放。这听起来可能很奇怪,因为该对象还拥有 sheet,因此当 sheet 未关闭时,该对象将处于活动状态。但是,为了以防万一,我把拥有populate
方法的对象全局声明给了父对象,但是还是出现了同样的问题
如有任何帮助,我们将不胜感激。 谢谢
海梅
您必须在全局范围内声明源对象才能触发事件并防止源对象被垃圾收集器从堆中清除:
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
}
如您所见,worksheet
对象是在 class 级别声明的,而不是方法。这意味着只要 class 实例存在,您就会触发事件。