C# 在excel中复制/粘贴listobject会丢失附加的事件
让我们创建一个ListObject并在其上附加一个事件,如msdn所述: 代码 在应用程序级加载项中,代码如下所示:C# 在excel中复制/粘贴listobject会丢失附加的事件,c#,vsto,C#,Vsto,让我们创建一个ListObject并在其上附加一个事件,如msdn所述: 代码 在应用程序级加载项中,代码如下所示: Worksheet worksheet = Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]); Excel.Range cell = worksheet.Range["$A$1:$D$4"]; ListObject list1 = worksheet
Worksheet worksheet = Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
Excel.Range cell = worksheet.Range["$A$1:$D$4"];
ListObject list1 = worksheet.Controls.AddListObject(cell, "list1");
list1.Selected += list1_SelectedDeselected;
list1.Deselected += list1_SelectedDeselected;
通过类似的方式查看触发的事件:
private void list1_SelectedDeselected(Excel.Range Target)
{
Worksheet worksheet = Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
Excel.Range cell = worksheet.Range["$A$6"];
if (cell.Value2 == "foo")
{
cell.Value2 = "bar";
}
else
{
cell.Value2 = "foo";
}
}
奇怪的行为
如果在excel中的外接程序中运行此代码,您将看到这个和那个
所选事件已触发>
已触发取消选择的事件>
如果在同一工作表中剪切/粘贴此表,将触发每个附加的事件
但是,如果剪切/粘贴到另一个工作表中,事件将不再附加到ListObject
我不知道这种不可预测的行为有什么原因吗?您需要使用另一个VSTO对象来重新订阅事件。GetVstoObject应用于获取新的工作表对象。您说,佩戴事件的实际对象是附加到工作表的ListObject,因此,如果我在运行时剪切ListObject以将其粘贴到新工作表上,则它是创建的ListObject的一个轻拷贝,因此我们将释放事件。就这样?