Событие MS Word Document Before Close не отменяется

У меня есть событие, связанное с событием DocumentBeforeClose для документа Microsoft Word на С#.

this.Application.DocumentBeforeClose +=
                new MSWord.ApplicationEvents4_DocumentBeforeCloseEventHandler(Application_DocumentBeforeClose);

Если какая-то логика верна, я устанавливаю флаг Cancel в true, чтобы документ не закрывался. Однако, несмотря на то, что событие запускается и для флага Cancel установлено значение true, документ все равно закрывается.

Это ошибка?


person Joe W    schedule 25.09.2012    source источник
comment
Просто отойдите немного. По логике вещей, когда вы устанавливаете для Cancel значение false, не означает ли это, что функция Cancel не должна работать, а установка ее в true должна заставить ее работать? То, что вы говорите, что сделали, вы установили для Cancel значение true.   -  person Steven    schedule 25.09.2012
comment
Установка @Steven для отмены на true означает «да», отмените событие закрытия. Если Джо устанавливает для отмены значение true, но документ закрывается, похоже, что-то не так.   -  person phoog    schedule 25.09.2012
comment
@phoog А, спасибо за разъяснение.   -  person Steven    schedule 25.09.2012


Ответы (1)


Я наконец-то понял. Мне также нужно было подключить обработчик событий к фактическому объекту документа Word (Microsoft.Office.Tools.Word.Document). (Tools.Word.Document и Interop.Word.Document вызывают у меня головную боль...)

this.Application.DocumentBeforeClose += new Interop.Word.ApplicationEvents4_DocumentBeforeCloseEventHandler(Application_DocumentBeforeClose);

Application_DocumentBeforeClose(Interop.Word.Document document, ref bool Cancel)
{
  // Documents is a list of the active Tools.Word.Document objects.
  if (this.Documents.ContainsKey(document.FullName))
  {
    // I set the tag to true to indicate I want to cancel.
    this.Document[document.FullName].Tag = true;
  }
}

public MyDocument() 
{
  // Tools.Office.Document object
  doc.BeforeClose += new CancelEventHandler(WordDocument_BeforeClose);
}

private void WordDocument_BeforeClose(object sender, CancelEventArgs e)
{
  Tools.Word.Document doc = sender as Tools.Word.Document;

  // This is where I now check the tag I set.
  bool? cancel = doc.Tag as bool?;
  if (cancel == true)
  {
    e.Cancel = true;
  }
}

Итак, поскольку вся логика моего приложения выполняется в коде класса Application, мне нужен был способ указать моему событию класса MyDocument, что я хочу отменить событие закрытия. Вот почему я использую объект тега для сохранения флага.

person Joe W    schedule 28.09.2012