Text Control 中的域可以与MS Word中的域进行相互的导入和导出操作,Text Control中的ApplicationField类为获取/设置域的数据/参数提供了相应的公共接口。下面将结合MS Word中最常用的MERGEFIELD 和 FORMTEXTBOX功能来讲解域相关的操作。
相应的源代码可以在TX Text Control.NET的安装目录中找到: Samples\WinForms\VB.NET\ ApplicationFields Samples\WinForms\CSharp\ ApplicationFields (一)实现MERGEFIELD 类 在MS Word和RTF文档中会经常用到合并域,通过合并域能在模板设计器中为文本域添加一些附加信息,例如:可以指定文本应该显示在文本域的前面还是后面,或者指定文本的显示格式。为了能够处理这些字段和相应的功能,示例程序中实现了三个不同的类: • MergeField • MergeFieldCollection • CollectionSync MergeField类继承与TextField,并扩展了相应功能。通过MergeField可以得到该类所处理的ApplicationField的引用。此外,MergeField包含下面的这些属性: • TextFormat • TextBefore • TextAfter • Mapped • MergeFieldName • PreserveFormatting • VerticalFormatting 当设置MergeField的TextBefore属性时,会相应地设置ApplicationField的Text属性,此外,新的设置会以一种合适的值保存在Parameters属性中。 MergeFieldCollection是一个MergeField的集合类,它实现了标准集合类型的公共属性和方法。 最后,需要实现TextControl和MergeFieldCollection集合中各个对象的同步。当ApplicationField集合改变时都需要进行同步操作。这个类型提供了两个重要的事件,用于监听TextControl中的变化:TextFieldCreated 和 TextFieldDeleted。 启动示例程序之后,点击File/Load菜单加载示例文档,该文档包含很多合并域字段,将输入光标定位到一个存在的字段中,例如《COMPANY》字段: 从MergeField菜单中选择Edit..菜单项,打开合并域字段的编辑对话框: 在这个对话框中,可以处理MergeField的所有属性,选中“Text to be inserted after”复选框,然后输入相应的文字,这些文本将被插入到该字段的后边,点击【OK】按钮关闭设置该设置对话框。 通过Merge/Merge fields...菜单打开客户数据表格,选中一条客户信息,点击【Merge】按钮将数据库中数据合并到文档中。 以上操作时通过循环遍历MergeFieldCollection中的字段,并替换字段的Text属性,代码如下:[C#] DataGridViewRow curRow = dataGridView1.SelectedRows[0]; foreach (MergeField curMergeField in m_mergeFieldCollection) { foreach (DataGridViewTextBoxCell curCell in curRow.Cells) { if (curCell.OwningColumn.Name == curMergeField.MergeFieldName) curMergeField.Text = curCell.Value.ToString(); } }
(二)实现FORMTEXT类
FormText字段在MS Word中用来创建可填充的文档。在许多应用系统中,例如文档自动化,这些字段必须是完全自动可读的。ApplicationField对象就像是这些字段所有属性的一个容器。 为了与第一个例子有所区别,这个例子中为FormText字段实现了一个类型,该类型不是继承于TextField。在该示例中没有需要同步的集合类型,每次编辑一个FORMTEXT类型的ApplicationField,都会创建一个FormText对象:[C#] FormText curFormText = new FormText(textControl1.ApplicationFields.GetItem());
[C#] mailMerge.TextComponent = tx; mailMerge.LoadTemplateFromMemory(Document, TXTextControl.DocumentServer.FileFormat.InternalUnicodeFormat); mailMerge.Merge(DataTable, true);