Infopath是微软Office办公软件家族中的成员之一它主要的功能是面向客户端收集XML数据并按照预期定义的格式生成XML文件它以可视化表单的形式收集数据并且支持C#编程接口以及外部数据源等Infopath的使用避免了最终用户以完全手写的方式生成XML数据文件同时也可以统一XML文件的格式在MOSS系统和网站开发中被广泛使用
使用Infopath开发一个XML前端表单页面需要有几个特定的步骤如编写XML示例文件生成XML Schema文件在Infopath中导入主数据源设计Infopath表单呈现如果需要还可以给表单添加C#事件代码如表单打开保存时所要执行的动作附加按钮的执行动作等读者如果对Infopath的开发有兴趣可以单独去研究本文主要介绍在Infopath中如何实现数据的有效性验证
在Infopath中有三种方法可以实现数据的有效性验证
使用Infopath的内置数据类型
给输入项添加自定义数据验证条件或验证事件
通过给表单自定义按钮添加规则或验证事件来进行数据有效性验证
使用Infopath内置数据类型进行数据的自动验证
这是最简单的数据验证方法在Infopath中添加控件或给主数据源中的域指定控件的时候可以为控件的输入指定数据类型如果没有为Infopath指定单独的主数据源那么Infopath将按照你在表单中添加的控件来构建数据源结构如果在表单编辑之前已经指定了主数据源则控件所接受的数据类型依赖于它所绑定的数据源中域的数据类型数据源中域的数据类型可在编写XML Schema文件时单独指定如果没有指定默认为String类型表示可接受任何类型的数据
在Infopath中右键单击要设置数据有效性验证的控件点击属性或者直接双击该控件在弹出的对话框中设置控件的数据类型如下图 Infopath支持下列数据类型
文本(string)
整数(integer)
小数(double)
布尔(True/False)
超链接(anyURI)
日期(date)
时间(time)
日期和时间(datetime)
在属性对话框中我们还可以设置数据的默认值以及数据格式等当设置了控件的数据类型后最终用户在填写表单时如果类型不匹配则Infopath会给出相应的提示信息如
使用自定义数据验证条件或验证事件进行数据有效性验证
你可以在Infopath中设置自定义数据验证条件或编写自定义事件进行数据的有效性验证这需要一些额外的编程开销或计算机编程方面的知识
使用自定义数据验证条件
右键单击要设置数据有效性验证的控件点击属性或者直接双击该控件在弹出的对话框中点击数据验证按钮在弹出的对话框中点击添加在数据验证对话框中设置数据验证条件并填写当数据验证失败时屏幕的提示信息以及警告对话框要显示的消息内容
Infopath已经集成了很多数据验证条件方便用户直接选择如域中的值大于小于等于包含不包含等等如果你想定义自己的匹配模式可以选择匹配模式或不匹配模式然后在第三个下拉列表中选择选择模式在弹出的对话框中编写自定义模式正则表达式例如你想规定该域只能接受包含小数点的数字你可以编写如下正则
?[]*\?[]+
然后设置警告信息
使用自定义验证事件
使用自定义验证事件需要编写C#代码进行数据的有效性验证因为Infopath内置了VSTA编程接口使得我们可以非常方便地通过Visual Studio为Infopath编写C#代码以完成一些特定的功能在这里要注意一下编写本文时我本机的开发环境是Visual Studio + Office 在安装Office 时必须手动将Infopath项下的VSTA选项勾上否则Infopath默认是不支持VSTA编程接口的Infopath中的VSTA默认使用的Visual Studio 的开发环境读者不需要特定去安装Visual Studio 默认情况下VSTA会将所需的程序及环境配置好
右键单击要设置数据有效性验证的控件选择编程Validating事件此时Infopath会联系Visual Studio打开VSTA工程在VSTA工程中我们可以为事件添加自定义方法有一个地方需要说明默认情况下Infopath会以VBNET语言创建VSTA工程如果你想更改工程语言可以点击工具选项在设计选项卡中将语言选为C#同时你还可以设置工程的默认保存位置如果之前你已经创建了VBNET语言的VSTA工程可以通过工具表单选项在编程选项卡中删除代码然后重新创建新的VSTA工程在此处也可以选择本Infopath表单的VSTA工程的存放位置
我们在VSTA中添加如下代码以实现我们在上例中限制只接受数字类型的数据验证效果
publicvoid field_Validating(object sender XmlValidatingEventArgs e)
{
if (!eUndoRedo && eOperation == XmlOperationValueChange)
{
// 获取数据源中域的值
XPathNavigator root = MainDataSourceCreateNavigator();
string field = rootSelectSingleNode(//my:field NamespaceManager)Value;
// 检查用户输入项是否匹配正则表达式
SystemTextRegularExpressionsRegex regEx =new SystemTextRegularExpressionsRegex(@?[]*\?[]+);
if (!regExIsMatch(field))
{
eReportError(eSite true 仅允许数字);
}
}
}
保存代码并关闭Visual Studio保存或发布编写好的Infopath表单然后直接打开表单实例在所要验证的域中输入内容当验证失败时Infopath会按照验证事件代码中的要求弹出相应的提示
在按钮上使用规则或验证事件进行数据有效性验证
在Infopath中除了上面介绍的两种方法可以实现数据的有效性验证外我们还可以通过给表单上的按钮设置规则及验证事件来验证域的数据有效性
使用规则进行数据有效性验证
例如表单中有一个文本框一个表达式框和一个按钮我们想验证用户在文本框中输入的值是否为一个数字并且将信息显示在表达式框中按照下面的步骤给按钮添加规则
右键单击按钮点击属性或者直接双击按钮在弹出的对话框中点击规则按钮
在规则对话框中点击添加
在规则对话框中点击添加操作
在操作对话框中从操作下拉列表中选择设置域值
点击域后面的按钮在弹出的对话框中选择表达式框所绑定的域点击确定关闭对话框
保持操作对话框中值文本框为空点击确定关闭然后关闭规则对话框
此时在规则对话框中已经添加了一条新的规则其作用是当按钮点击时清空表达式框中的值按照前面的步骤再添加一条规则同样绑定到表达式框上并将值设置成仅允许数字
给规则设置条件在条件对话框中选择要进行验证的域(此处应该是文本框所对应的域)然后选择不匹配模式同时设置匹配的正则表达式为?[]*\?[]+
确定并关闭所有的对话框
当用户打开表单实例时在文本框中输入非数字然后点击按钮此时表达式框中会出现相应提示如果用户输入的内容符合验证规则则表达式框中的内容被清空
在按钮上使用验证事件进行数据有效性验证
右键单击按钮点击属性或者直接双击按钮在属性对话框中点击编辑表单代码在VSTA工程代码中已经新添加了一个按钮事件添加下面的代码
publicvoid CTRL__Clicked(object sender ClickedEventArgs e)
{
// 获取表单数据源根节点的引用
XPathNavigator root = MainDataSourceCreateNavigator();
// 清空表达式框中的内容
rootSelectSingleNode(my:field NamespaceManager)SetValue();
// 检查文本框中的值是否为数字并且在表达式框中显示提示信息
string field = rootSelectSingleNode(my:field NamespaceManager)Value;
SystemTextRegularExpressionsRegex regEx =new SystemTextRegularExpressionsRegex(@?[]*\?[]+);
if (!regExIsMatch(field))
{
rootSelectSingleNode(//my:field NamespaceManager)SetValue(仅允许数字);
}
}
注意在Infopath中所有的数据验证仅会给出相应的提示信息用户可以强制保存表单并忽略数据有效性验证的提示信息另外本文C#代码中所使用的主数据源节点名称(如my:fieldmy:field等)因实际情况而异