DCWriter电子病历文本编辑器软件说明
1. 简介
DCWriter电子病历文本编辑器软件(简称DCWriter)是一款完全用C#编写的、运行在微软.NET平台上的软件组件,没有使用MS Word、RichEditBox等其他任何文本编辑器组件,完全自主实现了富格式文本编辑功能。可以非常完美的集成到各类.NET应用系统中,包括WinForm.NET、WPF、ASP.NET、命令行程序或者后台服务程序。
DCWriter除了实现了强大的通用文本编辑功能外,还针对电子病历业务添加了续打、输入域、半结构化文档、级联模板、三级查房权限控制、痕迹保留、医学表达式等功能,是开发电子病历应用系统的理想基础。
2. 运行环境
DCWriter运行在微软Windows操作系统以及微软.NET框架2.0及更高版本的系统中,硬件为x86 PC机及兼容系统。
3. 功能点介绍
DCWriter详细的功能点有
3.1. 文档编辑功能
1 2 3
DCWriter提供强大的文档编辑功能,主要有:
文字编辑功能。包括设置字体名称、字体大小、粗体、斜体、下划线样式、文字颜色、文字背景色、上下标。
支持数字式的和圆点式的段落列表。
支持图片,支持鼠标拖拽改变图片大小,支持在图片中添加批注信息,批注信息保存后可以再编辑。可以使用如下图所示的对话框来编辑图片批注信息。
4
支持段落设置。支持段落左缩进、行首缩进、段前间距、段后间距、行间距。可以使用如下图所示的对话框来设置参数。
5 6
支持表格。支持单元格的无限制的横向合并和纵向合并。单元格内可以进行图文混排。支持无限制的表格套嵌表格。可以设置表格的标题行。
可以使用如下图所示的对话框来设置单元格和图片的边框和背景。
7
DCWriter支持两种页面视图模式
分页视图模式,这种模式下文档的显示结果和打印一样:
普通视图模式:
8 被选择区域高亮度显示模式。DCWriter支持两种被选择区域的显示模式。
反色高亮度显示被选择区域,如下图所示:
半透明色高亮度显示被选择区域,如下图所示:
9
重做、撤销。DCWriter支持不受次数限制的重做和撤销操作。对文档的任何修改都能重做和撤销。
10 OLE拖拽。DCWriter支持OLE拖拽来插入内容。可以从Windows资源管理器中拖拽图片文
件到编辑器中而插入图片内容。也支持从MS Word或者其他文档编辑器中拖拽插入数据。还支持拖拽文档内容来编辑文档内容。
3.2. 痕迹保留和权限控制
DCWriter支持痕迹保留和权限控制。实现的功能点有: 1. 分等级的权限控制
DCWriter支持分等级的权限控制。用户能向编辑器登记用户登录信息并指定用户的权限等级,用户权限等级是一个整数,数值越大则权限就越高。低权限的用户不能修改和删除高权限的用户输入的文档内容,而高权限的用户能修改和删除低权限的用户输入的内容;而且低权限用户输入的内容被高权限的用户修改了样式后,则这些内容就转而属于高权限的用户的,此时低权限用户就不能修改和删除这些曾经由自己输入的内容了。
DCWriter编辑器提供一种管理员模式,当运行在该模式下,权限控制无效,文档中的任意部分都可修改。
2. 逻辑删除和物理删除
DCWriter支持逻辑删除和物理删除,逻辑删除就是程序并不删除文档内容,而是标记为逻辑删除了,不可见。此时当编辑器允许显示逻辑删除的内容时,这些被隐藏的内容又显示出来了,此时会附加上红色删除线的标记。
物理删除就是真正的删除文档内容,此时被删除的内容就不再存在,也就不可能再次显示出来了。
3. 痕迹保留和再现
DCWriter支持痕迹保留和再现。能以单条蓝色下划线显示权限等级为1(一般对应于主治医师)输入的内容;以蓝色双下划线显示权限等级大于等于2(一般对应于主任医师)输入的内容;以单条红色删除线显示被权限等级为1的用户逻辑删除的内容;以红色双删除线显示被权限等级大于等于2的用户逻辑删除的内容。
当鼠标移动到标记了痕迹信息的文档内容上面时会显示相关的提示文本进行详细说明。如下图所示,这段文档就留下了用户修改痕迹:
在这里,被红色删除线标注的文档内容就是被逻辑删除的部分。当编辑器不显示逻辑删除的内容时,这段文档就显示如下:
当不显示修改痕迹时,也就是处于整洁显示模式下,此时文档内容显示如下:
DCWriter支持整洁打印,此时打印出来的文档不显示被逻辑删除的内容,也不会显示权限标记。在进行整洁打印时,当文本编辑器处于整洁视图模式下,支持续打、支持打印当前页。若文本编辑器显示了用户修改痕迹时,不支持续打,也不支持打印当前页的功能。
3.3. 输入域
DCWriter支持输入域的功能,应用系统据此能实现半结构化文档的功能。 DCWriter支持文本输入域,如下所示:
当插入点在文本输入域中或者鼠标光标悬停在文本输入域的上面时,整个文本输入域就会以蓝色背景高亮度显示,以提醒用户。
文本输入域可以设置背景文本,例如:
当这个文本输入域中没有任何内容时,就会显示灰色的背景文本以提醒用户。当用户输
入了内容后,就不再显示背景文本了。
文本输入域可以设置为带有数据校验格式的,例如:
这个年龄输入域设置为不得为空,而且只能输入数字,最小值为0,最大值为150,当输入的数据不符合校验格式时,系统会自动设置为红色背景高亮度显示,当鼠标移到输入域上面是还会显示错误提示信息。
DCWriter还支持时间日期数据的输入,并显示用户界面让用户选择时间日期。例如下面是一个日期数据输入域:
当插入点在文本输入域时按下F2键或者鼠标双击输入域,则会弹出日期选择界面,而用户就可以在这个界面中选择日期值了。 DCWriter支持时间日期输入域,如下所示:
DCWriter还支持下拉列表方式编辑输入域的值,例如:
该输入域能弹出下拉列表来帮助录入数据,在这个列表中,用户可以鼠标点击操作选择列表项目,而可以输入拼音码来快速定位列表项目。这里的拼音码是根据列表中显示的文本自动生成的,无需维护。
这个下拉列表还可以设置为多选,例如:
而且这个列表中的列表项目既可以在编辑文档时录入,也可以通过编程从其他地方加载,比如从数据库加载。
3.4. 医学表达式
DCWriter目前支持2种医学表达式,如下所示:
具有4个文本的医学表达式:
。
当用户用鼠标双击医学表达式或者选中表达式按下F2键,则医学表达式进入编辑模式,此时显示为:[2012年05月29日,Value2,Value3,Value4]。在这里用户可以直接编辑医学表达式的内容,而且可以套嵌插入输入域来编辑数值。
具有3个文本的医学表达式:。
处于编辑状态下的医学表达式:[Value1,Value2,Value3]。
3.5. 条形码
DCWriter支持30种条码,其样式如下: UPCA UPCE SUPP2 SUPP5 EAN13 EAN8 Interleaved2of5 I2of5 Standard2of5 Code39
Code39Extended Code93 Codabar PostNet BOOKLAND ISBN JAN13 MSI_Mod10 MSI_2Mod10 MSI_Mod11 MSI_Mod11_Mod10 Modified_Plessey CODE11 USD8 UCC12 UCC13 LOGMARS Code128A
Code128B Code128C 3.6. 单选框、复选框
DCWriter支持单选框和复选框。入下图所示: 对于单选框,当鼠标点击设置了勾选状态后,同组的其他单选框就会去掉勾选状态,而且当鼠标光标移动到单选或者复选框上时,系统会以蓝色背景高亮度突出显示同组的其他的单选框或复选框的。
3.7. 级联模板
DCWriter支持级联模板,能根据当前输入域中的值来动态的设置文档其他部分是否可见,而且这种操作是可以套嵌的。例如:
在这里,当用户选择了“吸烟”,则后面的详细描述吸烟的文本片段将显示出来。 当用户选择了“不吸烟”或者为空时,后面的详细描述吸烟的文本片段将自动隐藏掉。如下图所示:
这个过程是可逆的,也就是说,当后面文本片段隐藏后,若用户再次设置“吸
烟”值,则后面的那段文本又显示出来了。
级联模板时可以套嵌的,如下图所示: 当用户选择“有戒烟治疗”时,后面的详细描述戒烟治疗的文本片段会显示出来,当用户选择“无戒烟治疗”时,后面的文本就会隐藏掉,如下图所示:
DCWriter支持更复杂的级联模板功能。
3.8. 数据源绑定
DCWriter中的文本输入域域可以绑定数据源,文档对象有一些内置参数,字段域就可以绑定到这些参数来显示参数值。
字段域也可以修改绑定的数据源,比如编辑控件有一个ServerObject属性,将数据源对象设置到该属性上,然后可以在文档中使用参数名ServerObject来获得该对象,并可读取或设置该对象的属性值。
关于数据源绑定的详细信息可以参考后续相关章节。
3.9. 表达式
DCWriter支持表达式,例如“len( value ) > 3 && value < 999 ”,表达式文本不区分大小写,但字符串值是区分大小写的。目前支持的运算有:
逻辑运算:运算符有“OR”逻辑或、“AND”逻辑与、“NOT”逻辑反。 数学运算:支持加减乘除、“MOD”取模,支持圆括号修改运算优先级。 函数:DCWriter支持以下内置函数 ABS(V) ACOS(V) ASIN(V) ATAN(V) ATAN2(X,Y) 获得绝对值。 计算反余弦值。 计算反正弦值。 计算反正切值。 计算反正切值。
AVERAGE(X1,X2...) CDOUBLE(V,DefaultValue) CEILING(V) CINT(V,DefaultValue) COS(V) COUNT(X1,X2,...) EXP(V) FLOOR(V) INT(V) LOG(A,BASE) LOG(V) MAX(V1,V2...) MIN(V1,V2...) MOD(V,DIVISOR) ODD(V) POW(NUMER,POWER) PRODUCT(V1,V2,V3...) RADIANS(V) RAND() ROUND(V) ROUNDDOWN(V) ROUNDUP(V) SIGN(V) SIN(V) SQRT(V) SUM(V1,V2...) TAN(V) 计算算术平均值。 将指定数据转换为浮点数,第二个参数为转换失败后的返回的默认值。 获得大于等于指定数值的最小整数。 将指定数据转换为整数,第二个参数为转换失败后返回的默认值。 返回指定角度的余弦值。 返回参数的个数。 返回e的n次方。 返回小于等于指定数字的整数。 四舍五入的数字取整。 返回指定底数的对数值。 返回以10为底数的对数值。 返回最大值。 返回最小值。 返回两数相除的余数。 将正(负)数向上(下)舍入到最接近的奇数。 返回某数的乘幂。 返回所有参数的乘积。 将角度转换为弧度。 返回一个介于0到1之间的随机数。 进行四舍五入计算。 向下舍入数字。 向上舍入数字。 为正数返回1,为零返回0,为负数返回-1 。 返回指定角度的正弦值。 返回数值的平方根。 返回所有参数的和。 返回指定角度的正切值。 变量:表达式支持变量。例如“value”表示当前执行表达式的元素的Text值;也可以使用“this.属性名”获得当前元素的指定属性的值,例如“this.Text”、
“this.ID”、“this.Name”;也可以直呼其名的获得文档对象Parameters列表中的文档参数值;还可以直呼其名的获得文档中指定ID或者名称的输入域的值,例如文档中具有一个ID或Name值为“身高”的文本输入域,则可以执行类似“身高<150”这样的表达式。
3.10. 打印
DCWriter支持所见即所得的打印。除了常规的文档打印外,还支持整洁打印和续打。
3.10.1. 整洁打印
整洁打印文档时,不会将文档中的痕迹保留信息打印出来,此时打印的文档比较整洁,不包含各种用户修改痕迹。
3.10.2. 续打
续打,也就是断点继续打印,是一种很特殊的打印功能,DCWriter支持续打功能,如下图所示:
当文本编辑器处于续打模式,此时用户可以使用鼠标点击操作来设置续打位置,此 时蓝色半透明区域中的内容不会打印,而且发生续打的那一页不打印页眉页脚。
3.11. 视图模式
DCWriter支持多种文档视图模式,目前有:
3.11.1. 页面视图模式
页面视图模式如下图所示:
3.11.2. 普通视图模式
普通视图模式如下图所示:
3.11.3. 续打视图模式
续打视图模式如下图所示:
3.11.4. 表单视图模式
表单视图模式如下图所示:
在表单视图模式下,用户只能在文本输入域中编辑内容,输入域之外的内容是只读的,甚至是不可选的,插入点也限制在文本输入域中。
表单视图模式可以和其他视图模式搭配使用。
3.11.5. 复杂视图模式
编辑器控件在复杂视图模式下,能显示所有的用户操作痕迹,包括新增和被逻辑删除的内容。在这种视图模式下,用户删除内容的操作都是逻辑删除。
如下图所示,在复杂视图模式下,文档内容显示如下:
复杂视图模式和简洁视图模式是互斥的,但可以和其他视图模式搭配使用。
3.11.6. 简洁视图模式
编辑器控件在简洁视图模式下,不显示用户操作痕迹,用户删除内容的操作都是物理删除。如下图所示,在简洁视图模式下,文档内容显示如下:
简洁视图模式和复杂视图模式是互斥的,但可以和其他视图模式搭配使用。
3.12. 文件格式
DCWriter支持多种文件格式,主要有
3.12.1. XML格式
DCWriter支持XML文件格式,能读取和保存为XML格式,这种格式是一种自定义的格式,和Word XML或者OpenOffice XML不一样。从开发角度上来说,这个XML文件实际上就是DCWriter内部的文本文档对象模型的XML序列化的结果。
XML格式保存了DCWriter文档的所有的内容,具有一定的向上和向下的兼容性,而且应用程序也可以无需通过DCWriter而直接修改文档中的内容,推荐使用。
3.12.2. RTF格式
DCWriter支持RTF文件格式,能读取和保存RTF文件格式,能识别RTF文档中的表格、页眉、页脚内容。
3.12.3. HTML格式
DCWriter支持将文档保存为HTML文件格式,但不支持打开HTML文件。
3.13. 电子病历功能规范对照表
DCWriter能实现国家制定的《电子病历功能规范》中的针对病历文档编辑器而制定的大
部分功能需求,主要有: 电子病历功能规范条款 第九条第二点:对电子病历数据的创建、修改、删除等任何操作自动生成、保存审计日志(至少包括操作时间、操作者、操作内容等),并提供按审计项目追踪查看其所有操作者、按操作者追踪查看其所有操作等功能。 第十条第一款第一点:支持对各种类型的病历资料的转换、存储管理,并采用公开的数据存储格式,使用非特定的系统或软件能够解读电子病历资料。 第十条第一款第五点:具有电子病历数据备份和恢复功能;当电子病历系统更新、升级时,应当确保原有数据的继承与使用。 DCWriter实现情况 在保存电子病历文档时,编辑器能在文档中保存当前操作员的编号、姓名、保存时间、说明信息等内容,多次保存将产生多条历史记录。 DCWriter能将文档存储为XML或RTF等公开格式的文件。 DCWriter提供向上和向下兼容性,新版本的编辑器能加载旧版本保存的电子病历文档。 第十条第二款第一点:以适当的方式保存完DCWriter能加载电子病历文档并能完整的展整医疗记录,能够以原有样式再现医疗记录。 现出来。 第十三条: 为患者创建电子病历,必须赋予患者唯一的标识号码,建立包含患者基本属性信息的主索引记录,确保患者的各种电子病历相关记录正确地与患者唯一标识号码相对应。 第十四条第一款第一点:为患者(含急诊或其他情况下身份不确定的患者)创建电子病历并赋予统一编码的唯一标识号码功能,通过该标识号码可查阅患者的电子病历相关信息。 第十四条第一款第二点:为每位患者电子病历创建唯一的主索引,并记录患者基本信息(应当至少包括患者姓名、性别、出生日期、常驻地地址等),并能够对患者基本信息进行必要的修改、补充和完善。 第十四条第一款第三点:提供电子病历主索引自动查重功能,按照患者基本信息记录对系统可能存在的重复记录给予提示并由人工确认。 第十五条:提供电子病历自动查重功能,能够将同一患者的多重电子病历与该患者唯一标识号码进行关联,通过唯一标识号码可查阅患者的电子病历相关信息。 创建和维护患者标识号码是应用系统的功能。DCWriter支持向电子病历文档插入自定义附加数据,这些数据就可以是患者标识号码等信息。这样病历文档就能和患者编号相对应了。 电子病历文档中能附加患者号码,这样病历文档就能和患者编号相对应了。 患者基本信息应该是应用系统维护。 电子病历文档中可以插入对这些数据的引用,DCWriter在加载文档时能更新这些引用,从而获得和显示应用系统中最新的患者信息。 电子病历文档能附加上主索引编号,应用系统据此能实现该功能。 电子病历文档可附加患者标识号码,应用系统可以据此实现该功能。 第十九条第二点:提供以自由文本方式录入DCWriter能使用下拉列表的方式辅助快速录诊断(或主诉)、手术及操作名称的功能。 入诊断等具有大量可选项目的数据,也可以用自由文本方式进行录入。 第二十条第一款第二点:提供以自由文本方式录入诊断、手术及操作名称的功能。 DCWriter支持自由文本方式录入。
第二十条第二款第二点:提供为临床试验病例、教学病例等特殊病历资料进行标识的功能。 第二十三条第二点:提供住院病历创建信息补记、修改等操作功能,对操作者应当进行身份识别、保存历次操作印痕、标记准确的操作时间和操作者信息。 第二十四条第一款第一点:支持各类型病历资料录入与编辑的功能。 DCWriter支持附加任意数据,应用系统可以据此实现该功能。 DCWriter支持电子病历文本操作印痕的保存和显示,能记录操作时间和操作信息。 DCWriter支持。 第二十四条第一款第二点:提供按照病历类DCWriter提供接口,应用系统可以根据需要型、内容和要求,根据电子病历系统中相关从多个文档中抽取部分内容,然后组成一个数据,自动生成住院病历部分内容的功能。 新的病历文档。 第二十四条第一款第三点:提供自由文本录入功能。 第二十四条第一款第四点:提供在住院病历指定内容中复制、粘贴患者本人住院病历相同信息的功能;禁止复制、粘贴非患者本人信息的功能。 第二十四条第一款第五点:提供模板辅助录入功能,可以按照住院病历类型、疾病病种选择所需模板;模板内容应当符合该疾病现有诊疗指南、规范要求。 DCWriter提供仿MS Word的用户体验,能自由录入文本。 DCWriter能在病历文档中附加患者标识信息,并提供接口,在复制粘贴操作中提供数据过滤的功能,应用系统据此实现该功能。 应用系统可以调用DCWriter,在一个病历文档中完整的插入另外一个病历文档的内容,从而实现病历文档模板功能。 第二十四条第一款第六点:提供为医疗机构DCWriter支持页面设置。 定制各类型住院病历默认样式的功能,默认样式包括纸张尺寸、字体大小、版面设置等。 第二十四条第一款第七点:提供暂时保存未电子病历文档可以附加数据,应用系统可以完成住院病历记录,并授权用户查看、修改、向病历文档附加操作状态数据,据此实现该完成该病历记录,提供住院病历记录确认完功能。 成并记录完成时间的功能。 第二十四条第一款第八点:提供住院病历记录双签名功能,当由实习医师、试用期医务人员书写病历时,应当经过本医疗机构注册的医务人员审阅、修改,并保留书写者与审阅者的双签名。 DCWriter提供痕迹保留、审阅标记等功能,应用系统据此实现改功能。 第二十四条第二款第一点:提供在住院病历DCWriter能在电子病历文档中插入对外部数记录中插入患者基本信息、医嘱信息、辅助据的引用。编辑器加载病历文档时能从应用检查报告、生命体征信息等相关内容的功能。 系统获得数据更新文档中的引用,从而在文档中显示应用系统中最新的数据。 第二十四条第二款第三点:提供结构化病历记录项目内容合理性检查与提示功能,包括项目独立检查和项目之间、项目与患者个人特征间的相关性检查。 第二十四条第二款第四点:提供包含展现样式的病历记录录入编辑和保存功能;提供所DCWriter提供对文档输入域的自动的和手动的数据校验功能,应用系统据此实现该功能。 DCWriter提供所见即所得的文档内容编辑界面,显示和打印结果一样
见即所得的病历记录录入编辑功能。 规范第二十四条第三款第一点:提供在住院病历记录中嵌入图片、表格、多媒体数据并进行编辑的功能。 第二十四条第三款第三点:.提供常用术语词库辅助录入功能,术语词库包括症状名称、疾病名称、药物名称、手术名称、护理常规名称等. 第二十四条第三款第四点:提供结构化(可交互元素)模板辅助录入功能,并在病历记录中保留结构化模板形成的结构。 第二十五条第一款第一点:提供病历记录的修改和删除功能,并自动保存病历记录修改的痕迹;对已确认完成的病历记录进行修改时,系统自动记录修改内容、修改人、修改时间。 第二十五条第一款第二点:对病历记录按照用户修改权限管理的功能,允许上级医务人员修改下级医务人员创建的病历记录。 规范第二十五条第二款:提供病历记录禁止修改的设置功能。 DCWriter支持在文档中插入图片、表格,表格支持单元格的任意横向合并和纵向合并,支持表格套嵌表格,支持标题行。 DCWriter的文本输入域具有下拉列表方式辅助快速录入的功能。 DCWriter支持结构化的存储,输入域的内容能和其他普通文本内容区分开来。 DCWriter支持痕迹保留功能,应用系统可以据此实现该功能。 DCWriter支持三级查房权限控制,应用系统可以据此实现该功能。 DCWriter的文本编辑器可以设置为内容只读,可以实现该功能。 第二十六条第二款第一点:提供创建结构化DCWriter支持单选、多选、必填项、填空、模板功能,结构化模板至少包含单选项、多不可修改文本等功能。 选项、必填项、填空、不可修改文本等元素。 第二十六条第二款第二点:提供模板中定义自动宏替换元素功能,宏替换元素可用于在病历记录中经常出现的患者姓名、性别、主诉等内容。 DCWriter中的输入域支持绑定到数据源,应用程序也可以编程方式设置文档输入域的内容。 第二十六条第二款第三点:提供结构化模板DCWriter支持订制的录入方式、取值范围和中,对结构化元素设定录入方式、取值范围、数据校验。 校验规则等属性功能。 第四十二条第一款:提供可浏览患者各类电子病历内容的独立软件。 第四十三条第三款第二点:提供与病历数据同时展现相关修改痕迹信息的功能,至少包括修改时间、修改人、修改内容等信息。 第四十四条第一款第一点:提供将电子病历中的各类医疗记录进行纸张打印的功能,打印格式符合卫生行政管理部门对纸质病历的相关要求。 第四十四条第一款第二点:提供电子病历记录按照最终内容(不含修改痕迹)打印的功能。 第四十四条第一款第三点:提供电子病历打应用系统在DCWriter的支持下即可实现该功能。 DCWriter支持痕迹保留功能。 DCWriter支持页面设置和打印。 DCWriter支持整洁打印。 DCWriter 支持连续打印。
印预览、接续打印功能。 第四十四条第三款第二点:提供将电子病历中的各类医疗记录以电子文件格式导出的功能。 aaaa
DCWriter能将文档保存为XML、RTF、HTML格式。 4. 开发接口
DCWriter提供非常丰富的开发接口,说明如下:
4.1. 软件模块结构
DCWriter从功能上分为如下几个功能模块。
RenderGUIFile Format ConverterRTFXMLHTMLSecurityDOMCommandsDataPrinting
在这个结构当中是以DOM为核心的,各个功能模块说明如下:
4.1.1. DOM
DOM是DCWriter的核心功能模块。它定义了文本文档对象模型,将文档中所有的内容都描述成一个个可编程对象。其中存储着大量的关键数据和关键例程。
下图就是DCWriter的DOM模块中的类型继承图。
XTextElementXTextCharElementXTextObjectElementXTextCheckBoxElementBaseXTextCheckBoxElementXTextImageElementXTextContainerElementXTextDocumentXTextContentElementXTextTableCellElementXTextDocumentContentElementXTextDocumentBodyElementXTextDocumentHeaderElementXTextDocumentFooterElementXTextFieldElementXTextInputFieldElementBaseXTextInputFieldElementXTextShapeInputFieldElementXTextBarcodeFieldElementXTextMedicalExpressionFieldElementXTextTableElementXTextTableRowElementXTextTableColumnElementXTextPageBreakElementXTextLineBreakElementXTextEOFElementXTextParagraphFlagElementXTextFieldBorderElement
通过这个图可以看出,文档中所有的内容都可以用文档元素表示,所有的文档元素都是从XTextElement类型派生出来的,由于DCWriter支持比较复杂的文档结构,因此定义了很多文档元素类型来实现所需的功能。
下图为DCWriter中DOM模块的对象组织结构图:
XTextDocumentHeaderElementsBodyElementsFooterElementsContentStylesDefaultStylesStyle0CreatorIndexDeleterIndexStyle1Style2StyleNDocumentControlerServerObjectInfoUserHistoriesHistory0History1History2HistoryNPageSettingsParametersOptionsSecurityOptionsViewOptionsBehaviorOptionsElement0StyleIndexElement1Element2ElementN
在这个DOM结构图中,XTextDocument对象是根节点,表示整个文档,是其他模块和应用程序访问DOM结构的唯一入口点。XTextDocument对象包含了很多成员,比如Body成员表示文档的正文内容,下面有若干个Element成员表示文档中的一个个片段内容。
在这个图形中带箭头的虚线表示文档元素的样式和授权控制管理信息。
EditOptions4.1.1.1. 直接操作DOM结构
开发人员可以直接编写代码操作DOM结构。往DOM树状结构添加删除内容。如下代码: XTextDocument document = myEditControl.Document ; ContentBuilder bulder = new ContentBuilder(document.Header);
DocumentContentStyle dcs = new DocumentContentStyle(); dcs.FontSize = 20; dcs.Color = System.Drawing.Color.Red; bulder.Append(\这是一段页眉 第\,dcs); XTextPageInfoElement pi = new XTextPageInfoElement(); pi.ContentType = PageInfoContentType.PageIndex; pi.StyleIndex = document.ContentStyles.GetStyleIndex(dcs); bulder.Append( pi ); bulder.Append(\共 页\, dcs); XTextPageInfoElement pc = new XTextPageInfoElement(); pc.ContentType = PageInfoContentType.NumOfPages; pc.StyleIndex = document.ContentStyles.GetStyleIndex(dcs); bulder.Append( pc ); bulder.Append(\页\, dcs); dcs = new DocumentContentStyle(); dcs.Align = DocumentContentAlignment.Center; bulder.SetParagraphStyle(dcs); bulder = new ContentBuilder(document.Body); dcs = new DocumentContentStyle(); dcs.Color = System.Drawing.Color.Yellow; bulder.Append(\这是文档正文内容\, dcs); bulder.AppendParagraphFlag(); dcs = new DocumentContentStyle(); dcs.FontSize = 40; bulder.Append(\页面第二行\, dcs); bulder = new ContentBuilder(document.Footer); dcs = new DocumentContentStyle(); dcs.FontSize = 30; dcs.Color = System.Drawing.Color.Blue; bulder.Append(\这是页脚内容\, dcs); myEditControl.Document.ContentStyles.Default.FontSize = 40; myEditControl.Document.ContentStyles.Default.Color = System.Drawing.Color.Tomato; myEditControl.RefreshDocument(); 在这里,文档对象的Header、Footer、Body属性分别表示页眉、页脚、和正文部分,都是容器元素。理论上说开发者可以直接操作容易元素的Elements列表,但操作复杂,而且容易出错。
为此DCWriter提供了一个文档内容创建器,类型为DCSoft.Writer.ContentBuidler。在这段例子代码就使用了ContentBuilder。ContentBuilder类型成员有: public ContentBuilder( XTextContainerElement container ) 对象构造函数,参数为添加内容的容器元素对象。 public DocumentContentStyle ContentStyle{get;set;}
默认文档内容样式。
public DocumentContentStyle ParagraphStyle{get;set;} 默认的段落样式。 public void Clear( )
清空内容。
public void SetParagraphStyle(DocumentContentStyle style) 设置段落样式。
public XTextElementList Append(string text, DocumentContentStyle style) 添加文档内容,第二个参数为指定的文档内容样式。 public XTextElementList Append(string text )
以默认的样式添加文档内容。
public XTextParagraphFlagElement AppendParagraphFlag(DocumentContentStyle style) 添加段落。
public XTextParagraphFlagElement AppendParagraphFlag( ) 以默认的段落样式添加段落。
public void Append(XTextElement element) 添加文档内容。
public void Append(XTextElementList elements) 添加多个文档元素对象。
4.1.2. Render
Render是文本文档内容呈现器。它负责绘制和渲染文档内容,根据DOM中的结构和数据在用户界面上和打印机上面绘制文档内容。
4.1.3. GUI
GUI是DCWriter的用户界面层。包括文本编辑器控件,一些文档元素数据编辑器等等。它是绘制文档内容的容器,此外还接受鼠标和键盘操作,调用Commands模块来访问DOM,当修改了DOM的内容后,会调用Render模块来重新绘制用户界面,更新文档视图。
4.1.4. File Format Converter
文件格式转换模块,负责将DOM中的文档数据转换为XML、RTF或HTML文档格式,也可以解析XML、RTF文档并生成DOM文档结构。
4.1.5. Commands
该模块是操作命令模块,定义了用户界面层可用的命令。这样上层应用程序不用直接操作复杂的DOM结构,而是指定名称通过命令的方式操作DOM结构。
Commands模块中还存在一个很重要的模块:应用程序宿主。它的对象类型是DCSoft.Writer.WriterAppHost。它搭建一个比较独立的后台环境,将命令功能模块、用户开发的服务器模块等等组织在一起。一般而言一个应用程序只有一个Host,当然也可以有多个Host同时运行。
WriterAppHost的主要成员有
public DCSoft.Writer.Commands.WriterCommandContainer CommandContainer{get;set;}
功能模块模块容器对象。
public System.ComponentModel.ServiceContainer Services{get;set;} 服务器对象容器。
public void AddService( Type type , object instance ) 添加服务器容器对象实例。
public WriterAppHostConfig Config{get;set;} 配置信息对象。 此外定义有静态成员
public static string GetResigerMachineCode ( )
获得注册时是用的本地机器码。 public static bool Register( string code )
进行产品注册。
public static WriterAppHost Default{get;}
默认的宿主对象,基本上都是使用本属性返回的对象实例。
编辑器控件和文档对象都具有AppHost属性来设置和返回应用程序宿主对象,通常都是返回WriterAppHost.Default指定的默认值。系统都是通过这个宿主来获得编辑器命令功能模块和用户开发的服务器对象实例。
4.1.6. Data
Data模块是管理数据的内部模块。用于实现数据源绑定。
4.1.7. 可扩展文件系统
Data模块中包括了一个可扩展的文件系统操作模块。编辑器内部使用这个文件系统来执行内部的加载和保存文档的功能。默认情况下,编辑器配置的基本的文件系统是基于本地操作系统文件的,开发者可以扩展该文件系统模块来实现将文件保存在数据库、FTP服务器或其他地方。
DCWriter中定义了一个名为DCSoft.Writer.Data.IFileSystem的接口,其定义如下: ///
/// 打开文件 /// /// ///
4.1.8. Printing
Printing是打印相关的功能模块。
4.1.9. Security
Security是安全和授权相关的模块,是实现痕迹保留和权限等级的基础。
4.2. 文档视图的度量和坐标
DCWriter的文档视图的度量单位是System.Drawing.GraphicsUnit.Document,也就是三百
分之一英寸,而没采用和设备相关的像素单位,这样就能实现所见即所得了。
由于.NET框架中描述打印相关的度量单位就是百分之一英寸为单位,为此DCWriter的页面设置中采用是的百分之一英寸为单位的。因此文档对象的纸张大小、页边距等都是采用百分之一英寸为单位的。
默认情况下,DCWriter文档采用A4大小的纸张,也就是宽度827个单位(8.27英寸)、高度1169个单位(11.69英寸),采用纵向打印模式,页边距都是100个单位(1英寸)。页眉顶端距离纸张上边缘为50个单位(0.5英寸),页脚低端距离纸张下边缘为50个单位(0.5英寸)。
4.3. 文档内容样式开发接口
在大部分情况下,开发者想要改变文档内容,都是通过调用编辑器命令的方式来实现的,关于编辑器命令可参考后面的相关章节。
DCWriter支持复杂的文档内容样式,包括字体、颜色、边框、对齐方式等等。DCWriter中是集中管理文档样式信息,并且文档元素引用文档样式。
文档对象XTextDocument有一个签名为“public DCSoft.Writer.Dom.DocumentContentStyleContainer ContentStyles{get;set;}”的属性。该属性值就是文档内容样式容器,DocumentContentStyleContainer类型主要属性有 public DCSoft.Drawing.ContentStyle Default{get;set;}
文档默认样式,它实际上返回一个类型为DCSoft.Writer.Dom.DocumentContentStyle的对象实例。
public DCSoft.Drawing.ContentStyleList Styles{get;set;}
文档中所有样式的列表,该列表元素成员类型实际上是DCSoft.Writer.Dom.DocumentContentStyle。
DCWriter文档元素都是从XTextElement类型派生的,XTextElement类型有一个签名为“public virtual int StyleIndex{get;set;}”的属性,该属性值就是其引用的文档样式编号,因此可以使用代码“document.ContentStyles.Styles[ element.StyleIndex]”获得文档元素引用的文档内容样式;若StyleIndex为-1或者其他不合理的值,则文档元素引用默认样式,也就是document.ContentStyles.Default的值。
注意:当文档在一个编辑器控件中显示和编辑时,文档的默认字体就自动设置为编辑器控件的字体;文档的默认文本颜色就自动设置为编辑器的前景色。这个过程是自动的,外界即使修改了文档的默认属性也是没有用的。
XTextElement类型有一个签名为“public DocumentContentStyle Style{get;set;}”的属性就是返回改文档元素引用的内容样式对象。
文档元素在实际使用文档内容样式时不会直接使用其引用的文档样式,而是先将文档样式和文档默认样式进行合并,再使用它。为此XTextElement类型有一个签名为“public DocumentContentStyle RuntimeStyle{get;}”的属性来返回这个运行时实际使用的文档样式。
DocumentContentStyle类型主要属性有 背景相关属性
public System.Drawing.Color BackgroundColor{get;set;}
背景色。默认为透明色。
public DCSoft.Drawing.XImageValue BackgroundImage{get;set;} 背景图片。
public System.Drawing.ContentAlignment BackgroundPosition{get;set;}
背景对齐方式。
public float BackgroundPositionX{get;set;} 背景X轴方向偏移量。
Public float BackgroundPositionY{get;set;} 背景Y轴方向偏移量。
public bool BackgroundRepeat{get;set;} 是否重复绘制背景。 文字相关属性
public System.Drawing.Color Color{get;set;} 文字颜色。
public DCSoft.Drawing.XFontValue Font{get;set;} 字体。
public string FontName{get;set;}
字体名称,默认为系统默认字体名称。 public float FontSize{get;set;} 字体大小,默认为9。 public bool Italic{get;set;} 斜体,默认为false。 public bool Underline{get;set;} 下划线,默认为false。 public bool Strikeout{get;set;} 删除线,默认为false。 public bool Bold{get;set;} 粗体。
public bool Superscript{get;set;} 上标样式,默认为false。 public bool Subscript{get;set;} 下标样式,默认为false。 public float Spacing{get;set;} 字符间距,默认为0。 边框相关属性
public bool BorderLeft{get;set;}
是否显示左边框线,默认为false。 public bool BorderTop{get;set;} 是否显示上边框线,默认为false。 public bool BorderRight{get;set;} 是否显示右边框线,默认为false。 public bool BorderBottom{get;set;} 是否显示下边框线,默认为false。 public float BorderWidth{get;set;} 边框线粗细,默认为0。
public System.Drawing.Drawing2D.DashStyle BorderStyle{get;set;} 边框线样式,默认为Solid。 public float BorderSpacing{get;set;}
边框线间距,默认为0,仅适用于段落。 public float PaddingLeft{get;set;} 左内边距,默认为0。 public float PaddingTop{get;set;} 上内边距,默认为0。
public float PaddingRight{get;set;} 右内边距,默认为0。
public float PaddingBottom{get;set;} 下内边距,默认为0。 段落相关属性
public bool BulletedList{get;set;} 段落是否采用圆点式列表方式。 public bool NumberedList{get;set;}
段落是否采用数字式列表方式。
public DCSoft.Drawing.DocumentContentAlignment Align{get;set;} 段落对齐方式。可选值有Left,Center,Right,Justify,默认为Left。 public float SpacingBeforeParagrah{get;set;}
段落前间距,默认为0。
public float SpacingAfterParagraph{get;set;} 段落后间距,默认为0。 public float LineSpacing{get;set;} 行间距。
public DCSoft.Drawing.LineSpacingStyle LineSpacingStyle{get;set;} 行间距样式,它决定了LineSpacing属性值的意义,其可选值为 SpaceSingle Space1pt5 SpaceDouble SpaceExactly SpaceSpecify 单倍行距,此时LineSpacing值无意义。 1.5倍行距,此时LineSpacing值无意义。 双倍行距,此时LineSpacing值无意义。 最小值,此时LineSpacing值无意义。 固定值,此时LineSpacing指定了行间距。 注意在DCWriter中,行间距是文本行的上边缘和下行的上边缘之间的距离,而不是本行下边缘和下一行上边缘之间的距离,因此算是行高。 多倍行距,此时LineSpacing指定的倍数。 public DCSoft.Drawing.VerticalAlignStyle VerticalAlign{get;set;} 文本垂直对齐方式。仅适用于表格单元格。 public float FirstLineIndent{get;set;} 段落首行缩进量。
public float LeftIndent{get;set;} 段落左缩进量。 授权相关
public int CreatorIndex{get;set;}
创建文档内容的创建者历史记录编号,默认为-1。 public int DeleterIndex{get;set;} 删除文档内容的删除这历史记录编号,默认为-1。
SpaceMultiple
4.3.1. 修改文档样式
由于具有运行时的文档样式,因此当应用程序只是修改了文档的默认样式,则整个文档所有元素的样式也会随着更换。
由于采用样式列表引用的方式来设置文档元素的样式,因此不能直接修改文档元素的样式设置,例如执行“element.Style.Bold = true”这样的代码是错误的。而是需要执行以下代码: DocumentContentStyle style = new DocumentContentStyle(); style.Bold = true; element.Style = style; 也就是开发者不能直接设置元素的element.Style下面的设置,而必须创建一个新的DocumentContentStyle对象,然后设置它的值,最后将其设置到文档元素的Style属性值上。而且这种方法运行速度快,但只是更新了文档DOM结构,最后还必须调用编辑器控件的RefreshDocument方法更新文档视图,而且不能调用Undo/Redo命令重复和撤销操作。
4.4. 权限和痕迹保留开发接口
DCSoft.Writer支持文档内容等级权限控制。在打开文档后用户可以在编辑器中执行登录操作,每一次用户登录都系统都记录用户名和用户授权等级。此时新增、修改或逻辑删除的内容都归于当前用户名下。 操作控制
对于开发人员来说,用户授权等级就是一个整数,该数值越大,用户等级越高。在一篇文档内部,高等级用户制造的文档内容对低等级的用户来说是只读的,只能看不能修改。而低等级用户制造的文档内容高等级用户是可以查看和修改、删除的。 可视化显示
另外编辑器还能可视化的显示用户操作痕迹。对于等级小于等于0的用户,其内容正常显示;对于权限等级为1的用户,其插入的文档内容使用蓝色的单下划线来突出显示,其逻辑删除的内容使用红色的单条删除线来突出显示;对于权限等级大于等于2的用户,其插入的内容使用蓝色双下划线来突出显示,其逻辑删除的内容使用红色的双删除线来突出显示。
当鼠标停留在到文档内容上时,会显示一个提示标签,说明文档内容的创建信息和被逻辑删除的信息。
这样文档的权限控制从传统的文件级别深入到文档内部,这成为电子病历应用系统实现三级查房功能的技术基础。相信其他行业应用也可能存在类似的需求。 权限及痕迹数据的存储
应用程序可以通过DCSoft.Writer提供的DOM结构直接访问权限和痕迹信息。
文档对象是DCSoft.Writer.Dom.XTextDocument类型,它具有以下和痕迹和权限相关属性:
public DCSoft.Writer.Dom.DocumentContentStyleContainer ContentStyles{get;set;}
整个文档都使用的文档内容样式容器。该对象的Styles属性就是一个文档样式列表,其列表元素类型是DCSoft.Writer.Dom.DocumentContentStyle。该类型中权限相关的属性有
public int CreatorIndex{get;set;} 创建该文档元素的用户历史记录编号。系统使用该编号在文档对象的UserHistories列表中检索用户登录操作历史记录对象。
public int DeletorIndex{get;set;} 逻辑删除该文档元素的用户历史记录编号。 public DCSoft.Writer.Security.UserHistoryInfoList UserHistories{get;set;} 用户登录操作记录列表。它是一个列表,其最后一个元素就是当前用户登录历史记录。该列表元素类型为DCSoft.Writer.Security.UserHistoryInfo。UserHistoryInfo类型的属性有
int Index{get;set;} 记录编号。 string ID{get;set;} string Name{get;set;} DateTime SavedTime{get;set;} int PermissionLevel{get;set;} string Description{get;set;} string Tag{get;set;} 登录用户编号。 登录用户名。 保存文档的日期时间。 用户授权等级。 用户登录时附加的说明文字。 扩展数据。 文档中所有的元素都派生自DCSoft.Writer.Dom.XTextElement类型,该类型具有一个签名为“public int StyleIndex{get;set;}”的属性,系统就根据这个属性值在文档对象的ContentStyles.Styles列表中检索文档样式对象。
由于已经有了这些数据,编辑器软件就通过以下流程查找权限信息。
1. 获得文档元素对象(都是派生自XTextElement类型)的StyleIndex属性,检索文档对象
的ContentStyles.Styles列表,也就是通过代码“document.ContentStyles.Styles[ element.StyleIndex ]”获得文档样式对象。
2. 根据文档样式对象的CreatorIndex检索文档对象的UserHistories列表,也就是通过代码
“document.UserHistories[ style.CreatorIndex 或 style.DeletorIndex ]”获得用户登录历史记录信息对象。
3. 获得了文档历史记录对象的PermsissionLevel值,也就是创建或者逻辑删除该文档元素
的用户权限等级,然后跟当前用户权限等级进行比较。若大于当前等级,则当前用户无法修改该文档元素;若小于等于当前的等级,则当前用户可以修改或者删除该文档元素。
也就是说编辑器通过element.StyleIndex →document.ContentStyles.Styles →document.UserHistories这样的查询路径获得文档元素的授权信息。此时应用系统也可以通过这样的路径直接访问文档中的权限及痕迹保留信息。
启用权限控制
要应用文档内容等级权限控制,首先要启用授权控制,需要设置编辑器的以下属性 ctl.DocumentOptions.SecurityOptions.EnablePermission
是否启动文档内容等级权限控制,这是最基础的属性。 Ctl.DocumentOptions.SecurityOptions.EnableLogicDelete
是否启用逻辑删除功能。一般的用户功能需求都需要设置该属性。 ctl.DocumentOptions.SecurityOptions.ShowLogicDeleteContent
是否显示被逻辑删除的内容。这个视用户需求而设置。 ctl.DocumentOptions.SecurityOptions.ShowPermissionMark 是否显示用户痕迹标记。 用户登录 启用编辑器的权限控制后,应用程序通过两种模式进行登录。 1.自动登录。
应用程序设置编辑器控件的AutoUserLogin属性为true,这样启用自动登录,然后设置
编辑器控件的AutoUserLoginInfo属性值,定义好自动登录时的用户信息。
AutoUserLoginInfo属性值是DCSoft.Writer.Security.UserLoginInfo类型。该类型的属性有 string ID{get;set;} 用户登录号。 string Name{get;set;} int PermissionLevel{get;set;} string Description{get;set;} string Tag{get;set;} 用户名。 用户权限等级。该数值越高,用户权限等级越高。 用户此次的登录的说明信息。供应用程序使用,编辑器内部不使用。 扩展信息。供应用程序使用,编辑器内部不使用。 当设置好自动登录后,编辑器控件每次加载文档后就会自动登录,将指定的用户信息添加到文档中并设置为当前用户。 2.应用程序登录。
应用程序设置编辑器控件的AutoUserLogin属性为false,这样就需要应用程序登录了。应用程序在调用编辑器控件的LoadDocument方法加载文档后,或者响应编辑器控件的DocumentLoad事件来进行登录。
应用程序调用编辑器控件的UserLogin方法执行登录。通过这个方法来传递用户名、授权等级等登录信息。
4.5. 文本编辑器控件
DCWriter的GUI模块的核心就是文本编辑器控件,该控件类型为DCSoft.Writer.Controls.WriterControl。它是一个WinForm控件,并且是COM公开的。
该控件常用的成员有
public bool AllowDragContent{get;set;} 能否直接拖拽文档内容,默认为false。
Public bool IsCommandEnabled( string commandName )
判断指定名称的编辑器功能命令在当前是否可用。注意:调用这个函数只是返回命令状态,不会自动设置该命令绑定的按钮或菜单栏的状态。 Public bool IsCommandChecked( string commandName ) 判断指定名称的编辑器功能命令在当前是否处于勾选状态。注意:调用这个函数只是返回命令状态,不会自动设置该命令绑定的按钮或菜单栏的状态。
Public object ExecuteCommand( string commnadName , bool enableUI , object parameter ) 执行指定名称的编辑器功能命令。第一个参数指定命令名称,第二个参数为是否允许显示用户界面,第三个参数为用户指定的额外参数。 Public event CommandEventHandler CommandError
执行编辑器功能命令时出错时的事件。
Public virtual void OnCommandError( WriterCommand cmd , WriterCommandEventArgs cmdArgs , Exception exp ) 处理在执行编辑器功能命令时抛出的异常。 Public DateTime LastUIEventTime
最后一次用户界面事件的发生时间,用户界面事件包括鼠标键盘事件、OLE拖拽事件。应用程序可以根据这个属性值来实现超时锁定用户界面的功能。 Public bool Readonly{get;set;}
控件内容是否只读。
Public bool HeaderFooterReadonly{get;set;} 控件中显示的文档的页眉页脚内容是否只读。 Public string LicenseFlag{get;set;}
控件授权信息标记。
Public DCSoft.Writer.Controls.FormViewMode FormView{get;set;} 控件的表单视图模式。可选值有
Disable:不处于表单视图模式,用户可任意编辑。
Normal:处于普通表单视图模式,用户可以编辑输入域中的内容,输入域之外的内容只读,但可以选择。
Strict:严格的表单视图模式,可以可以编辑输入域中的内容,但输入域之外的内容只读,而且不可选项,插入点不可在输入域之外。
Public bool Modified{get;set;}
控件中文档内容是否被改变的标志。 Public object ServerObject{get;set;} 用于”Server”文档变量和脚本中的变量的对象实例。
Public DCSoft.Writer.DocumentOptions DocumentOptions{get;set;}
文档设置。
Public DCSoft.Writer.Dom.XTextDocument Document{get;set} 在控件中显示和编辑的文档对象。 Public int DocumentContentVersion{ get;} 当前文档内容的版本号,对文档内容的任何修改都会使得该版本号增加。 Public int WriteDataSource()
将文档输入域中的表单数据写入到文档对象绑定的数据源中。函数返回填写的数据条数。
Public DCSoft.Writer.Dom.DocumentControler DocumentControler{get;set;}
文档控制器。
Public bool IsAdministrator{get;set} 是否已管理员模式运行。
Public DCSoft.Writer.WriterAppHost AppHost{get;set;} 应用程序宿主对象。
Public void Move( DCSoft.Writer.MoveTarget target )
将插入点移动到指定位置。
Public DCSoft.Writer.Dom.DocumentContentStyle CurrentStyle{ get;} 当前文档样式。
Public DCSoft.Writer.Dom.XTextElement CurrentElement{get;} 获得当前插入点所在的文档元素对象。
Public DCSoft.Writer.Dom.XTextElement GetCurrentElement( Type elementType ) 获得插入点所在的指定类型的文档元素对象。
Public DCSoft.Writer.Dom.XTextElement HoverElement{get;} 当前鼠标光标下的文档元素对象。
Public DCSoft.Writer.Dom.XTextLine CurrentLine{get;} 当前插入点所在的文本行对象。
Public DCSoft.Writer.Dom.XTextElement GetElementById( string id );
获得指定ID号的文档元素大小,查找时ID值区分大小写。
Public DCSoft.Writer.Dom.XTextElementList GetSpecifyElements( Type elementType) 获得文档中所有的指定类型的文档元素列表。
Pulbic DCSoft.Writer.Dom.HighlightInfo HighlightRange{get;set;} 获得或设置文档中的高亮度显示区域。
Public DCSoft.Writer.Dom.HighlightInfoList HighlightRanges{ get;set;} 获得或设置文档中的多个高亮度显示区域。
Public DCSoft.Writer.Dom.XTextContentRender ContentRender{ get;set;} 获得或设置文档内容呈现器。 Public bool AutoUserLogin{get;set;}
每次打开文档时是否自动进行用户登录。
Public DCSoft.Writer.Security.UserLoginInfo AutoUserLoginInfo{get;set;} 执行自动登录时使用的用户登录信息。
Public bool UserLogin( string userID , string username , int permissionLevel )
执行用户登录,第一个参数为用户编号;第二个参数为用户名;第三个参数为用户授权登记。
Public bool UserLogin( UserLoginINfo loginInfo , bool updateUI )
执行用户登录,第一个参数为用户登录信息;第二个参数为是否更新用户界面。 Public bool LoadDocument( string fileName , DCSoft.Writer.FileFormat format ) 从指定的文件已指定的格式加载文档。
Public bool LoadDocument( System.IO.Stream steram , DCSoft.Writer.FileFormat format) 从指定的流中以指定的格式加载文档。 Public event EventHandler DocumentLoad 文档加载成功事件。
Public virtual void OnDocumentLoad( EventArgs args )
出发文档加载成功事件。
Public bool SaveDocument( string filename , FileFormat format ) 以指定的格式将文档保存在指定的文件中。 Public void ClearContent() 清空文档内容。
public void RefreshDocument() 属性文档视图。
Public override string Text{get;set;} 纯文本格式的文档内容。 Public string RTFText{ get;set;}
RTF格式的文档内容。 Public string XMLText{get;set;} XML格式的文档内容。
Public bool EnableJumpPrint{get;set;} 是否允许续打。
Public int JumpPrintPosition{get;set;} 设置和获得续打位置。
Public event EventHandler HoverElementChanged 鼠标悬停的元素发生改变事件。
Public virtual void OnHoverElementChanged( XTextElement oldHoverElement , XTextElement newHoverElement )
触发鼠标悬停的文档元素发生改变事件。第一个参数为旧的鼠标悬停元素,第二个参数为新的鼠标悬停元素。
Public bool HideCaretWhenHasSelection{get;set;} 当选择了文档内容时是否隐藏插入点光标。 Public void SelectAll() 选择文档中所有的内容。 Public void Cut() 执行剪切操作。 Public void Copy() 执行复制操作。 Public void Paste() 执行粘贴操作。 Public void Undo() 执行撤销操作。 Public void Redo()
执行重复操作。
Public void DeleteSelection() 删除被选中的文档内容。 Public int CurrentColumnIndex 获得从1开始计算的当前列号。 Public int CurrentLineIndex 获得从0开始的当前行号。 Public int CurrentLineIndexInPage
获得从1开始计算的当前文本行在页中的序号。 Public DCSoft.Writer.XTextSelection Selection 文档中被选中的部分内容。 Public void PrintDocument() 打印整个文档。
Public void PrintCurrentPage() 打印当前页。
Public event EventHandler DocumentContentChanged 文档内容发生改变事件。
Public event EventHandler SelectionChanged
插入点或文档内容被选择状态发生改变事件。
Pulbic event SelectionChangingEventHandler SelectionChanging 插入点或文档内容被选中状态正在发生改变事件。这个事件是可以撤销的。 Public bool IsEditingElementValue{get;} 控件正在弹出一个用户界面编辑输入域的内容。 Public bool CancelEditElementValue() 取消编辑输入域内容的操作。
Public bool BeginEditElementValue( XTextElement element , bool detect ) 开始执行编辑元素内容的操作。第一个参数为文档元素对象;第二个参数为指示本次调
用只是检测当前元素的值能否编辑,但不执行编辑操作。 Public string PageTitle{get;} 页面标题。
Public string StatusText{get;set;}
状态栏文本。
Public void SetStatusText( string text ) 设置状态栏文本。
Public event EventHandler StatusTextChanged 状态栏文本发生改变事件。 Public void ShowAboutDialog()
显示关于对话框。
4.5.1. WinForm开发
编辑器控件可以用于WinForm应用程序开发。其过程和其他WinForm控件没多大差别。也就是将控件添加到WinForm窗体设计器的控件工具条上,然后拖拽一个控件到窗体上即可使用。
4.5.1.1. 数据交换
DCWriter编辑器控件通过两种方式和其他应用程序交换数据,包括系统剪切板和OLE拖拽。
4.5.1.1.1. 系统剪切板
编辑器控件支持复制数据到Windows系统剪切板和从Windows系统剪切板粘贴数据。当编辑器控件复制数据到剪切板时,复制的数据是多格式的,包括 1. 纯文本格式。
2. 自定义的内置XML字符串格式,该格式名称为“DCWriterXML V:编辑器版本号”,例如
“DCWriter V:1.1.23.3424”。该格式的数据就是一段能用于加载文档的XML字符串。 3. HTML文档格式。 4. RTF文档格式。
5. 当复制的文档内容是一个图片文档元素时,还输出图片格式。
编辑器从系统剪切板粘贴数据时,编辑器以此支持以下格式:
1. 文件名。当数据为一个文件名,而且指向的文件名的扩展名
为.bmp、.png、.jpg、.jpeg、.gif、.emf。则认为它是图片文件。编辑器会加载文件并向文档插入一个图片元素。
2. 位图对象。如果数据为一个位图对象,则编辑器会据此向文档插入一个图片元素。 3. 系统内置XML格式。编辑器会以XML的格式加载文档并将其内容插入到当前文档中。 4. RTF文档。 5. 纯文本。
编辑器在粘贴数据时会调用数据过滤器。关于数据过滤可参看后续相关章节。
编辑器配置Copy命令用于复制数据到系统剪切板,配置Cut命令执行剪切操作,配置Paste命令用于粘贴系统剪切板中的数据,配置SpecifyPaste命令用于进行选择性粘贴。
剪切和粘贴操作对文档内容带来的影响都可以使用Undo、Redo命令来重做和撤销。
4.5.1.1.2. OLE拖拽
编辑器控件支持OLE拖拽操作。当编辑器控件的AllowDrop属性值为true,则支持OLE拖拽将数据复制到文档中;当编辑器控件的AllowDragContent数值为为true时,则支持OLE拖拽操作将数据复制或者移动到编辑器的其他部分或者其他程序中。
在执行OLE拖拽操作时,用户按下Ctl键则执行OLE拖拽复制操作,否则执行OLE拖拽移动操作。
OLE拖拽操作支持的数据格式和使用系统剪切板时支持的数据格式一样。
目前版本的DCWriter编辑器有一个已知的缺陷,那就是在同一个编辑器中执行OLE拖拽移动操作后,需要执行两次Undo命令才能完全撤销操作。
4.5.1.2. 数据过滤
编辑器控件支持数据过滤,从数据插入到编辑器的文档中时,开发者可以编程对数据进行过滤。这里的外界数据包括粘贴所得的数据、OLE拖拽所得的数据、用户手工输入的文档数据或者应用程序调用编辑器命令插入的数据。
DCWriter定义了一个签名为“public delegate void FilterValueEventHandler( object sender , FilterValueEventArgs args )”的委托。开发者只要创建一个委托对象,然后添加到AppHost中即可启用。
这个委托的第二个参数类型为DCSoft.Writer.Dom.FilterValueEventArgs,它的成员有: public DCSoft.Writer.Dom.InputValueSource Source{get;set;} 数据来源,可选值有
Clipboard:数据来自Windows系统剪切板。 UI:数据来自用户界面的用户输入。 Unknow:未知。
public string SourceName{get;set;}
数据来源的名称。
public InputValueType Type{get;set;}
数据类型,可选值有:
Text:纯文本数据。 RTF:RTF文档数据。 Image:图片数据。 FileName:文件名。
Dom:DCWriter文档DOM数据。
public object Value{get;set;} 要处理的数据。
public bool Cancel{get;set;}
取消相关数据操作的标记。
开发者可以使用以下代码来实现数据过滤: //使用这行代码来注册启动数据过滤器 ctl.AppHost.Services.AddService( typeof(DCSoft.Writer.Dom.FilterValueEventHandler ), new DCSoft.Writer.Dom.FilterValueEventHandler(MyFilterData)); // 数据过滤代码 private void MyFilterData(object sender, FilterValueEventArgs args) { 用户代码。 } 这样开发者就能实现数据过滤功能,比如在电子病历中,只能同一个人的病历之间的文本可以复制粘贴,而不同人的病历文本是不能粘贴的。使用数据过滤就能实现这个功能。
4.5.2. WPF开发
编辑器控件可以用于WPF开发。以下XAML代码即可将一个编辑器控件添加到WPF窗体中:
4.5.3. SmartClient+WEB开发
编辑器控件能用于SmartClient+Web开发,这样就能嵌入在WEB页面中运行而能应用于B/S系统。注意:该功能在客户端中仅支持IE7.0或者更高版本,其他版本的浏览器不支持;服务器端技术架构理论上不受限制,不过还是推荐使用ASP.NET。
实现该功能需要完成以下步骤:
1. B/S系统客户端环境的配置。需要在客户端安装微软.NET框架2.0或更高版本,推荐为
2.0或3.5。
2. 在IE的设置中将WEB服务器地址设置为可信站点。 3. 设置.NET框架的安全模式。具体为执行命令行““.NET框架安装目录/Caspol.exe -force -pp
off -machine -chggroup 1.5 FullTrust””。
4. 将DCWriter软件DLL文件拷贝到服务器某个目录下,推荐为发布目录的Lib子目录下。 5. 在WEB页面中插入以下HTML代码 6. 这样就可以在WEB页面中编写JavaScript代码来访问编辑器控件。例如 // 设置编辑器中的XML内容。 document.getElementById(\).XMLText = someXml ; // 获得编辑器中的XML内容。 someXml = document.getElementById(\).XMLText; // 执行命令,在文档中插入字符串 document.getElementById(\).ExecuteCommand(\张三李四王五\
由于DCWriter并不是完全的COM公开,而且有很多操作是JavaScript语法所不支持的,因此建议开发者在SmartClient开发中不要直接使用WriterControl类型。而是自己开发一个控件,该控件可以包含WriterControl控件或者从其派生出来,而且添加自定义的属性方法。例如使用以下代码定义一个用户自定义控件: using System; using System.Collections.Generic; using System.Text; using DCSoft.Writer.Security; namespace DCSoft.Writer.Test { [System.ComponentModel.ToolboxItem(false)] [System.Runtime.InteropServices.ComVisible(true)] [System.Runtime.InteropServices.Guid(\)] public class TestControl : DCSoft.Writer.Controls.WriterControl { public TestControl() { this.Document = new Dom.XTextDocument(); this.DocumentOptions = new DocumentOptions(); // Enable permission control
this.DocumentOptions.SecurityOptions.EnableLogicDelete = true; this.DocumentOptions.SecurityOptions.EnablePermission = true; this.DocumentOptions.SecurityOptions.ShowLogicDeletedContent = true; this.DocumentOptions.SecurityOptions.ShowPermissionMark = true; } ///
不过由于用户需要另外建立WinForm类型的控件来开发自定义控件,将生成自己的DLL文件,此时需要将DCSoft.Writer.dll和自定义DLL文件复制到WEB服务器上,这样开发、部署和测试都不是很方便。此时可以使用微软提供的ILMerge工具将两个DLL文件合并为一个DLL文件,这样就能解决这个问题。
关于ILMerge可参考微软的相关文档,本软件开发商也可提供ILMerge的GUI工具软件。
4.6. 文档元素
DCWriter支持的文档中包含多种文档元素,常用的有:
4.6.1. XTextElement文档基础元素
文档基础元素类型是DCSoft.Writer.Dom.XTextElement,它是所有文档元素类型的基础类型,其主要成员有:
4.6.2. XTextDocument 文档对象
文档对象类型是DCSoft.Writer.Dom.XTextDocument,它表示整个文档,其主要成员有: public string SpecifyTag{get;set;}
特殊的附加数据,这种数据能保存在复制粘贴过程中生成的临时XML文档,当不包含在其保存的XML文档。
这是一种特殊的附加数据,可用于复制粘贴操作时的额外处理,由于复制粘贴操作中被复制的文档内容会创建一个小的文档复制品然后进行XML序列化,此时该值也会随着被包含进去,粘贴时就会跟着还原出来,此时可用于额外控制。
例如,若设置本标记为病历号,则可以通过这个属性来实现不同病历之间数据不能复制粘贴的功能。
public Version EditorVersion{get;set;}
最后一次保存文档的编辑器的程序版本号。可用于兼容性处理。 public DocumentOptions Options{get;set;} 文档相关的配置项目,该对象不参与二进制和XML序列化。 public DocumentInfo Info{get;set;} 文档相关信息。
public bool Printing{get;set;} 文档正处于打印状态。 public bool Modified{get;set;} 文档内容发生改变标记。 public bool FileName{get;set;}
文件名。
public WriterAppHost AppHost{get;set;} 编辑器应用程序宿主对象。本属性首先使用文档对象自己的宿主对象,若没有则使用文档对象绑定的编辑器控件的宿主对象,若没有则使用默认宿主对象。 public DocumentControler DocumentControler{get;set;}
文档控制器。本属性内部首先使用其绑定的编辑器控件的控制器,若没有使用文档自己的控制器,若没有则创建一个新的控制器。 public XTextDocumentHeaderElement Header{get;} 页眉对象。
public XTextDocumentBodyElement Body{get;} 文档正文对象。
public XTextDocumentFooterElement Footer{get;} 页脚对象。
public XTextDocumentContentElement CurrentContentElement{get;}
当前插入点所在的文档内容块对象,它是Header,Body或Footer中的某个。
public XTextSelection Selection{get;} 当前被选择的内容。
public XTextElement CurrentElement{get;} 当前插入点所在的文档元素对象。 public XTextFieldElement CurrentField{get;}
当前插入点所在的域对象。
public XTextElement GetCurrentElement ( Type elementType ) 当前插入点所在的文档元素对象。
public virtual void OnDocumentLoad( EventArgs args )
触发文档的DocumentLoad事件。本方法内部还会调用文档绑定的编辑器控件的OnDocumentLoad方法。
public event EventHandler DocumentLoad
文档的加载成功的事件。当从XML、RTF文档加载文档内容时就会触发该事件。 public virtual void OnDocumentContentChanged( )
触发文档的DocumentContentChanged事件。本方法内部还会调用文档对象绑定的编辑器控件的OnDocumentContentChanged方法。
public event EventHandler DocumentContentChanged
文档内容发生改变事件。当用户修改了文档的任何内容时就会触发该事件。 public void OnSelectionChanged ( ) 触发文档的SelectionChanged事件。本方法还会调用文档对象绑定的编辑器控件的OnSelectionChanged方法。
public event EventHandler SelectionChanged
文档选择状态发生改变后的事件,包括选择区域改变或插入点位置的改变。 public virtual void OnSelectionChanging( SelectionChangingEventArgs args )
触发文档的SelectionChanging事件,本方法还会调用文档绑定的编辑器控件的OnSelectionChanging方法。
public event SelectionChangingEventHandler SelectionChanging
文档选择状态或插入点位置正在发生改变事件。该事件的第二个参数类型为SelectionChangingEventArgs,该参数类型的主要属性有 Document 事件相关的文档对象。 OldLineEndFlag OldSelectionIndex OldSelectionLength NewLineFlag NewSelectionIndex NewSelectionLength Cancel 旧的行尾标记。 旧的插入点位置。 旧的选择区域长度。 新的行尾标记。 新的插入点位置。 新的选择区域长度。 取消操作标记。应用程序可以设置该属性值为true来取消选择区域发生改变的操作。 public virtual void Load( string filename , FileFormat format ) 以指定的格式从指定的文件加载文档。
public virtual void Load( Stream stream , FileFormat format ) 以指定的格式从文件流中加载文档。
public void Save( string filename , FileFormat format )
以指定的格式将文档保存在文件中。
public void Save( Stream stream , FileFormat format ) 以指定的格式将文档保存在文件流中 public void Clear()
清空文档内容。
public DCSoft.Writer.Controls.WriterControl EditorControl{get;set;} 文档对象绑定的编辑器控件。 public string GetFormValue( string name ) 获得指定名称的输入域的文本内容。 public XTextElement GetElementById( string id )
获得文档中指定编号的元素对象,查找时ID值区分大小写的。 public XTextElementList GetSpecifyElements( Type elementType ) 获得文档中所有的指定类型的文档元素列表。 public string XMLText{get;set;}
获得或设置表示文档所有内容的XML字符串。 public string RTFText{get;set;}
获得或设置表示文档所有内容的RTF字符串。 public string Text{get;set;} 获得和设置表示文档正文内容的纯文本字符串。 public UserHistroyInfoList UserHistories{get;set;} 用户历史记录列表。
public XFontValue DefaultFont{get;set;}
文档使用的默认字体。
public DocumentContentStyleContainer ContentStyles{get;set;}
文档样式容器。
public void DeleteUselessStyle() 删除文档中没有使用到的样式。在文档编辑过程中,可能会产生没有任何文档元素使用到的文档样式,此时可以使用本方法来删除没有用的样式,减少文档数据量。 public DocumentContentStyle CurrentStyle{get;}
当前文档样式,该属性受插入点的位置改变或者执行了一些编辑器命令而改变。 public DocumentContentStyle CurrentParagraphStyle{get;} 当前段落样式。
public DocumentContentStyle DefaultStyle{get;} 默认文档样式。
public HighlightManager HighlightManager{get;}
文档视图中高亮度显示区域管理器。 public XTextElement HoverElement{get;set;} 文档视图中当前鼠标光标下的文档元素对象。
public virtual XTextElement GetElementAt( float x , float y , bool strict ) 获得指定文档视图中指定位置处的文档元素对象。 public DCSoft.Printing.XPageSettings PageSettings{get;set;} 文档页面设置。
public DCSoft.Printing.PrintPageCollection Pages{get;} 文档页列表。
public int PageIndex{get;set;}
从1开始计算的当前显示和打印的页号 public int UpdateDataBinding ( )
更新数据源绑定,重新从数据源中读取数据并填充到文档中。本方法可能会触发文档的DocumentContentChanged事件,但不会修改Modified标记。 public int WriteDataSource ( ) 将文档中的数据写入到数据源中。
public virtual DocumentParameterCollection Parameters{get;set;} 文档参数列表。
public object ServerObject{get;set;}
服务器对象。
public virtual ValueValidateResultList ValueValidate ( )
对整个文档的输入域进行数据校验,并返回校验结果。
特别注意:文档对象XTextDocment的Style和RuntimeStyle属性是不能用的。
4.6.3. XTextCharElement字符
DCWriter文档中最常见的字符元素,字符在DOM中的类型是DCSoft.Writer.Dom.XTextCharElement。
在DCWriter中,文档中的每一个字符都会生成一个XTextCharElement对象实例。该类型主要成员有:
public char CharValue{get;set;}
字符数据。
4.6.4. XTextImageElement图片
DCWriter支持图片,图片在DOM中的类型是DCSoft.Writer.Dom.XTextImageElement。该类型常用的成员有:
public string Title{get;set;}
标题。
public bool KeepWidthHeightRate{get;set;}
保持宽度、高度比例。若本属性值为true,则用户鼠标拖拽改变图片大小时会保持图片的宽度高度比例,否则用户可以随意改变图片的宽度和高度。 Public DCSoft.Drawing.XImageValue Image{get;set;}
图片内容。
应用程序可以调用编辑器命令InsertImage向文档的插入点位置插入一个图片元素。关于InsertImage命令可参看本文档的编辑器命令清单章节。
4.6.5. XTextPageInfoElement页码
页码元素类型为DCSoft.Writer.Dom.XTextPageInfoElement,它能显示当前页码和文档总页数。该类型的主要成员有:
public DCSoft.Writer.Dom.PageInfoContentType ContentType{get;set;}
显示的内容,可选值为: PageIndex:从1开始计算的页码。 NumOfPages:文档中页数。 NumOfGlobalPages:不支持。
4.6.6. 表格
DCWriter支持表格,支持表格单元格的横向合并和纵向合并,支持标题行,单元格内部可以图文混排,还支持表格套嵌表格。
可以调用编辑器命令InsertTable向文档插入表格,关于该命令可参考本文档后面的相关章节。
表格是有4种文档元素类型组成:表格元素XTextTableElement、表格行元素XTextTableRowElement、表格列元素XTextTableColumnElement和单元格类型XTextTableCellElement。
4.6.6.1. XTextTableElement类型
表格元素XTextTableElement类型表示整个表格,它常用的成员有: public XTextElementList Columns{get;} 该表格中所有的表格列对象组成的集合。 public XTextElementList Rows{get;} 该表格中所有的表格行对象组成的集合。 public XTextElementList Cells{get;}
该表格中所有的单元格组成的列表,包括被合并而隐藏的单元格。 public int NeastLevel{get;}
表格套嵌层次,文档中第一层表格的层次为1,子表格为2,再内部的子表格为3,以此类推。
public virtual XTextTableCellElement CreateCellInstance() 创建一个新的单元格对象实例。
public virtual XTextTableColumnElement CreateColumnInstance()
创建一个新的表格列对象实例。
public virtual XTextTableRowElement CreateRowInstance() 创建一个新的表格行对象实例。
当应用程序扩展DOM模型,而扩展成自己的表格模型时,可能需要扩展XTextTableColumnElement、XTextTableCellElement、XTextTableRowElement类型,而表格内部可能会自动生成表格组成元素对象实例,为了保持用户扩展的表格DOM结构的合法性,开发者需要重载XTextTableElement的CreateCellInstace、CreateColumnInstance、CreateRowIndex
方法来创建自定义的表格结构元素对象类型。
另外表格对象的Width属性和Height属性是只读的,表格的宽度和高度是由表格列和表格行的尺寸累计而出的,无法直接修改。
4.6.7. XTextTableColumnElement类型
表格列类型XTextTableColumnElement表示表格中的一个表格列,它常用的成员有: public float Width{get;set;} 表格列的宽度。 public int Index{get;}
从0开始计算的列号。
4.6.8. XTextTableRowElement类型
表格行类型XTextTableRowElement表示表格中的一个表格行,它常用的成员有: public int Index{get;} 从0开始计算的行号。 public XTextElementList Cells{get;} 该表格行包含的单元格对象,包括被合并而隐藏的单元格。 public float SpecifyHeight{get;set;}
用户指定的高度。若等于0则表格行自动设置高度,若大于0则表格行高度自动设置高度而且高度不小于用户指定的高度,若小于0则固定设置表格行的高度为用户指定的高度。 public bool HeaderStyle{get;set;} 表格行为标题行。当表格跨页时,标题行就会显示在每页的最上面。
4.6.9. XTextTableCellElement类型
表格单元格类型XTextTableCellElement表示表格中的一个单元格,它常用的成员有: public XTextTableCellElement OverrideCell{get;} 若单元格被其他单元格合并了则返回合并本单元格的单元格对象。 public string CellID{get;} 返回单元格的编号,例如“A4”、“B5”。 public bool Visible{get;}
获得或设置单元格是否可见,被合并的单元格是不可见的。 public bool IsOverried{get;} 判断本单元格是否被其他单元格合并了。 public int RowSpan{get;set;} 单元格跨行数,也就是单元格所占据的表格行数,本属性为1则占据一行,单元格纵向没有合并单元格,若该属性值大于1则纵向合并单元格。本属性类似于 HTML 的 TD 元素的 ROWSPAN 属性。 public int ColSpan{get;set;} 跨列数,也就是单元格所占据的表格列数,本属性值为1则单元格占据一列,单元格横
向没有合并单元格,若该属性值大于1则横向合并单元格。本属性类似 HTML 的 TD 元素的 COLSPAN 属性。 public int RowIndex{get;} 从0开始计算的行号。 public int ColIndex{get;}
从0开始计算的列号。
4.6.10. XTextInputFieldElement文本输入域
DCWriter支持文本输入域,文本输入域在DOM中的对象类型是DCSoft.Writer.Dom.XTextInputFieldElement。
用户可以文本输入域中直接编辑其内容,也可以以下列列表的方式编辑其内容。该类型常用的属性有: UserEditable 用户是否可以直接编辑该文本输入域的内容。比如当设置了下拉列表后,若设置该属性为true,则用户既可以使用下拉列表来设置输入域的内容也可以直接编辑该输入域的内容;若设置为该属性为false,则用户只能通过下拉列表的方式来设置输入域的内容而不能直接编辑输入域的内容。 输入域的名称。 输入域的内容是否只读,若设置为只读则用户都不能直接编辑文本域的内容,也不能通过下拉列表的方式修改内容。 背景文本。当输入域内容为空时,输入域就以指定颜色显示该背景文本。背景文本颜色是由输入域所属文档对象的Options.ViewOptions.BackgroundTextColor属性指定的,默认为灰色。 只有在编辑器中才可以显示背景文本,打印时不会打印背景文本。 显示的内容的格式化输出控制样式。 数据源绑定信息。 数据校验样式。 Name Readonly BackgroundText DisplayFormat ValueBinding ValidateStyle 开发者可以使用InsertInputField命令在文档当前插入点新增一个文本输入域,其代码如下: XTextInputFieldElement field = new XTextInputFieldElement(); ------------------ 设置 field 属性的代码 ----------------------- myEditControl.ExecuteCommand(\, false, field); 4.6.10.1. 数据源绑定
文本输入域能绑定到数据源中,它的ValueBinding属性就定义了数据源绑定信息,该属性的数据类型为DCSoft.Writer.Data.XDataBinding类型。该类型的主要属性有 public string DataSource{get;set;}
绑定的数据源的名称。系统将按照这个名称查找文档对象XTextDocument.Parameters列表中的数据。特别的对于名称为“server”参数,实际上是访问了文档对象的ServerObject
属性值。
public string BindingPath{get;set;}
绑定的数据源的路径名称。若原始数据为System.Xml.XmlNode类型,则该路径解释成XPath;若原始数据为System.Data.DataRow、DataRowView类型,则该路径解释为字段名;若原始数据未System.Data.IDataRecord类型,则该路径解释为字段名;若原始数据为System.Collections.IDictionary类型,则该路径解释为字典键值;若为其他类型,则该路径解释成对象的属性名,这里使用System.ComponentModel.PropertyDescriptor类型访问对象属性,因此支持System.ComponentModel.ICustomTypeDescriptor类型的原始数据源。
当原始数据不是XML类型时,该路径是可以多层叠加的,各层路径之间用点号分隔开来。
public bool AutoUpdate{get;set;} 是否在加载文档时自动从数据源中获得数据并更新输入域的内容。 public bool Readonly{get;set;}
指示该数据源绑定是只读的,不能根据输入域的内容更新数据源。
文本输入域有一个签名为“public virtual bool UpdateDataBinding( bool fastMode)”的方法,该方法能访问数据源,获得最新的数据并更新文本输入域中的内容。该方法参数指示是否快速更新内容而不更新文档视图,该方法的返回值就是操作是否修改了输入域的内容。
文本输入域还有一个签名为“public virtual bool WriteDataSource()”的方法。该方法就是读取输入域中的内容并更新到数据源中,该方法的返回值就指示操作是否修改了数据源。
从数据源读取数据并更新输入域的内容是一种系统级的操作,不受用户权限控制、不受文本编辑器只读限制,而且不改变文档或编辑器控件的Modified属性值。
4.6.10.2. 扩展数据源绑定功能
应用程序开发者可以扩展数据源绑定功能。需要经过以下步骤:
第一步:从类型DCSoft.Writer.Data.XDataBindingProvider派生出自定义的数据源绑定行为执行器类型。需要重写的成员有
public object DomReadValue( XTextElement element , XDataBinding binding , bool throwException )
编辑器系统就调用本方法来获得绑定数据源所得到的数据。该方法第一个参数就是操作的文档元素对象;第二个参数就是数据源绑定信息对象;第三个参数指明若操作失败是否抛出异常。本方法的返回值就是要填充到文档元素中的数值,一般为字符串类型。
public bool DomWriteValue( XTextElement element , XDataBinding binding , bool throwException )
编辑器系统将调用本方法将文档中的输入域中的数据写入数据源。本方法第一个参数就是文档元素对象;第二个参数就是数据源绑定信息对象;第三个参数指明若操作失败是否抛出异常。本方法的返回值就是是否成功的修改了数据源中的数据。
第二步:将用户自定义的数据源绑定行为执行器注册到应用系统中。有两种方法,一种是直接设置XTextDocument对象的 BindingProvider属性值;另外就是执行代码“ctl.AppHost.Services.AddService ( typeof( DCSoft.Writer.Data.XDataBindingProvider ) , 用户自定义的提供者对象实例 )”,将用户开发的数据源绑定行为执行器器注册到编辑器系统中。
4.6.10.3. 数据校验
文本输入域支持数据校验。
4.6.10.3.1. 数据校验设置
它定义了一个签名为“public DCSoft.Common.ValueValidateStyle ValidateStyle{get;set;}”的属性。该属性就定义了文本输入域的数据校验规则。类型ValueValidateStyle的主要属性有 public bool Required{get;set;} 指示该数据不能为空。
public DCSoft.Common.ValueTypeStyle ValueType{get;set;}
指示数据校验类型。可选值有
Text:文本格式。
Integer:为整数格式。 Numeric:为数字格式。 Date:为日期格式。 Time:为时间格式。
DateTime:为日期时间格式。
public int MaxLength{get;set;}
文本最大长度。若该值小于等于0则无此限制。 public int MinLength{get;set;} 文本最小长度。若该值小于等于0则无此限制。 public bool CheckMaxValue{get;set;} 是否检查数字或者日期值的最大值。 public bool CheckMinValue{get;set;} 是否检查数字或者日期值的最小值。 public double MaxValue{get;set;} 数字的最大值。若CheckMaxValue值为false,则该属性无效。 public double MinValue{get;set;} 数字的最小值。若CheckMinValue值为false,则该属性无效。 public DateTime DateTimeMaxValue{get;set;} 日期的最大值。若CheckMaxValue值为false,则该属性无效。 public DateTime DateTimeMinValue{get;set;}
日期的最小值。若CheckMaxValue值为false,则该属性无效。 public string CustomMessage{get;set;} 若数据校验不通过,则使用的自定义的校验错误提示信息,若该属性值为空,则系统会自动生成校验错误提示信息,并设置输入域的背景色为选项“ViewOptions.FieldInvalidateValueBackColor”指定的颜色,默认为淡红色。
编辑器控件或者文档对象的选项“EditOptions.ValueValidateMode”就指示编辑器控件何时进行数据校验。其可选值有
None:禁止数据校验。
Dynamic:实时的数据校验。用户修改输入域中的内容都会导致系统进行数据校验。
LostFocus:只有文本输入域失去输入焦点是才进行数据校验。 Program:用户的操作不会导致执行数据校验,需要应用程序调用接口来执行数据校验。 文档对象XTextDocument类型有一个签名为“public virtual DCSoft.Writer.Dom.ValueValidateResultList ValueValidate( )”的方法。该方法就能对整个文档的文本输入域进行数据校验。该方法返回一个类型为ValueValidateResultList的对象。这是一个列表,列表元素类型为ValueValidateResult。ValueValidateResult类型的主要属性有: public XTextElement Element{get;set;} 数据校验不通过的文档元素对象。 public string Message{get;set;}
数据校验结果提示信息。
应用程序可以调用这个ValueValidate方法,获得文档校验结果,然后以自定义的方式显示出来。
4.6.10.3.2. 数据校验过程
文本输入域元素有OnValidating方法及Validating事件,还有OnValidate方法及Validated事件。其签名为:
public virtual ValueValidateResult OnValidating( CancelEvent args , bool loadingDocument) public virtual void OnValidate()
当系统对文本输入域执行数据校验时,首先文档输入域元素对象的OnValidating方法。该方法的默认操作就是根据输入域元素的ValidateStyle属性值进行数据校验,若校验失败,则设置参数args.Cancel值为true。
系统根据OnVallidating的参数args.Cancel值进行后续处理。若Cancel值为false则说明校验成功,继续执行输入域对象的OnValidated方法。
4.6.10.4. 自定义下拉列表
DCSoft.Writer支持下拉列表,开发人员可以编写代码来自定义的提供下拉列表的内容,入下图所示: