C# 在excel中复制/粘贴listobject会丢失附加的事件

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

让我们创建一个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.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的一个轻拷贝,因此我们将释放事件。就这样?