捕获和响应数据存储区中的事件
客户可以侦听和响应节点或节点其所有子节点上的更改。 加载项可以响应以下事件。
在 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 支持和反馈,获取有关如何接收支持和提供反馈的指南。