捕获和响应数据存储区中的事件

客户可以侦听和响应节点或节点其所有子节点上的更改。 加载项可以响应以下事件。

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”节点。 更新节点的文本后,“你更改了!” 的更新文本将自动出现在第二个文本内容控件中。

此示例非常简单,但它演示了可以使用事件、XML 映射和内容控件执行的操作。 更改一个文本内容控件时,使用此类代码更新文档中的任何文本。 这很强大,因为它不考虑文档格式,并且不适用于文档格式。 相反,它适用于附加到文档的架构。

另请参阅

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。