Поделиться через


Запись событий в хранилище данных и реагирование на них

Клиент может прослушивать изменения на узле или на узле и на всех его дочерних элементах и реагировать на них. Надстройка может реагировать на следующие события.

В коллекции CustomXMLParts :

  • StreamAfterAdd позволяет клиенту отвечать после добавления в документ нового хранилища.
  • StreamBeforeDelete позволяет клиенту отвечать перед удалением хранилища из документа.
  • StreamAfterLoad позволяет клиенту отвечать на запросы после загрузки элемента хранилища с помощью XML.-

В объекте CustomXMLPart :

  • NodeAfterInsert позволяет клиенту отвечать после добавления нового узла в хранилище. Если добавленный узел содержит поддерев, событие срабатывает только один раз для самого верхнего узла.
  • NodeAfterDelete позволяет клиенту отвечать после удаления узла. Если удаленный узел содержит поддерев, событие срабатывает только один раз для самого верхнего узла.
  • NodeAfterReplace позволяет клиенту отвечать после замены XML-узла в хранилище.

Пример

Предположим, что есть XML-файл, C:\test.xml и два элемента управления текстовым содержимым. XML-файл выглядит следующим образом:

<?xml version="1.0" standalone="no"?>  
<root xmlns="urn:test">  
  <a>NodeA</a>  
  <b>NodeB</b>  
</root>

Одна из эффективных вещей, которую можно выполнить с помощью сопоставления XML, заключается в том, чтобы один сопоставленный элемент управления текстовым содержимым обновлял сразу же, когда пользователь обновляет другой элемент управления текстовым содержимым. Для этого используются события. Для этого создайте метод с событиями и запустите его.

Dim WithEvents objStream As CustomXMLPart 
 
Sub Demo() 
  Set objStream = ThisDocument.CustomXMLParts(4) 
End Sub

Запуск подпрограммы Demo настраивает переменную objStream для прослушивания событий.

Помните, что в предыдущем сценарии документ содержит два элемента управления текстовым содержимым: один из них сопоставлен с <a> узлом, а другой — с узлом "b". Предположим, что вы хотите настроить события таким образом, чтобы при изменении текста в <a> узле узел "b" автоматически что-то выполнял. Это выполняется в следующей подпрограмме событий objStream_NodeAfterReplace .

Private Sub objStream_NodeAfterReplace( _ 
        ByVal OldNode As Office.CustomXMLNode, _ 
        ByVal NewNode As Office.CustomXMLNode, _ 
        ByVal InUndoRedo As Boolean) 
 
    ' Check if NewNode, which is the node after the change, is 
    ' the "a" node by checking the BaseName of its ParentNode 
  If NewNode.ParentNode.BaseName = "a" Then 
    objStream.DocumentElement.LastChild.Text = "You changed a!" 
  End If 
 
End Sub

Эта подпрограмма активируется после того, как пользователь изменяет текст в первом элементе управления текстовым содержимым, сопоставленном с элементом <a>. Если текст в <a> узле изменяется, текст последнего дочернего элемента в пользовательской XML-части обновляется. Так как поток содержит только два узла, последним узлом является узел "b". После обновления текста узла во втором элементе управления текстовым содержимым автоматически появляется обновленный текст "Вы изменили a!".

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

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.