2015-02-27 2 views
0

Давайте создадим ListObject и прикрепить событие на нем, как MSDN объяснить здесь: https://msdn.microsoft.com/en-us/library/eyfs6478.aspxКопировать/вставить ListObject первенствует потерять присоединенные события

Кодекса

В надстройку на уровне приложений, код будет выглядеть выше:

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, вы увидите, что это и что

The <code>Selected</code> event is triggered The <code>Deselected</code> event is triggered

Если вы вырезать/вставить эту таблицу в тот же рабочий лист, все связанные события будут активированы.

Но если вы вырезать/вставить в другой лист, события не будут прикреплены больше к ListObject.

Есть ли причина, по которой я не знаю этого непредсказуемого поведения?

ответ

0

Вам нужно использовать другой объект VSTO для подписки на события заново. GetVstoObject следует использовать для получения нового объекта Worksheet.

+0

Вы говорите, что фактический объект, носящий событие, связан с объектом ListObject, прикрепленным к листу, поэтому, если я вырезал ListObject во время выполнения, чтобы вставить его на новый лист, это легкая копия созданного объекта ListObject, поэтому мы проиграть события. Это оно? – enguerran

Смежные вопросы