本文示例源代码或素材下载
本节的内容:
如何在InfoPath中使用数据连接来从XML文件中获取数据
如何通过代码来修改数据连接中的XML文件路径
打开Visual Studio 2008,以“InfoPath 2007表单模板”为项目模板新建一个项目。
项目创建完后,就会看到一个空空如也的mainifest.xsf文件,这就是InfoPath表单的设计区域,我们可以使用“工具箱”和“版式”面板来设计表单。
我们先不急于设计表单,而是添加一个数据连接。为了让示例更加有趣,我选择了Google Picasa Web Album的RSS作为外部数据,InfoPath表单将从RSS文件中获取相册列表并呈现出来。
添加此数据连接的方法如下:
在“数据源”面板中点击“管理数据连接”;
在弹出的“数据连接”对话框中点击“添加”;
在弹出的“数据连接向导”对话框中选择“新建连接”和“仅接收数据”,点击“下一步”;
选择“XML文档”作为数据源,点击“下一步”;
在XML位置文本框中输入一个Google Picasa Web Album的相册RSS地址,点击“下一步”;
选择“从指定位置访问数据”,点击“下一步”;
输入名称“getalbum”,勾选“在打开表单时自动检索数据”,点击“完成”。
此时在打开“数据源”面板,将数据源切换为刚才创建“getalbum(辅助)”,会看到InfoPath已经导入了该RSS文件的架构。
我们知道,RSS中表示具体条目的元素是item,在上图所示的RSS架构中,item元素被正确的识别为一个“重复项”。
接下来我们来添加一些控件并绑定到item及其子元素上,藉此来显示所有的相册,方法如下:
点击item元素旁的下箭头按钮,在其上下文菜单中选择【重复节】,这会在mainifest.xsf文件的设计界面中添加一个重复节控件,并且该控件绑定到了getalblum数据源的item元素上;
将光标定位到重复节控件内部,然后在“数据源”面板中选中item的子元素title,在其上下文菜单中点击【其他】;
在弹出的“选择控件”对话框中选择“表达式框”,点击“确定”,这会在重复节中添加一个用于显示相册标题的表达式框控件,并且该控件绑定到了item/title上。
将光标定位到重复节控件内部,然后在“数据源”面板中依次展开item/media:group/thumbnail,选中thumbnail的子元素url,在其上下文菜单中点击【其他】;
在弹出的“选择控件”对话框中选择“图片”,点击“确定”,这会在重复节中添加一个用于显示相册缩略图的图片控件,并且该控件绑定到了item/media:group/thumbnail/url上。
然后回到mainifest.xsf文件的设计界面中,简单的调整一下控件的尺寸,使其看起来如下图所示:
然后按F5键运行,可以看到InfoPath已经正确获取并显示了Google Picasa Web Album的相册列表:
效果看起来很棒,但到此为止,我们还没有编写一行代码。然而本例目前还只能读取我的Google Picasa Web Album的相册列表,下面我们来编写几行代码,把它改进成为一个InfoPath版的Google Picasa客户端浏览器。
具体步骤如下:
在“视图”面板中,选中唯一的视图,点击“视图属性”,在弹出的“视图属性”对话框中将视图名称修改为album;
在“视图”面板中,点击“添加新视图”来新建一个名为login的视图;
选中login视图,单击右键,选择【设为默认值】;
在login视图中添加一个名为username的文本框控件;
在login视图中添加一个标签为View Albums的按钮控件;
简单地调整一下login视图的版式,使其看起来如下图所示:
然后右键单击View Albums按钮,选择【“按钮”属性】;
在弹出的“按钮属性”对话框中点击“编辑表单代码”按钮,这会在FormCode.cs中生成一个CTRL2_5_Clicked方法(你的方法名称或许会和我的稍有不同)。
在FormCode.cs中定义一个全局变量:string userName;
在CTRL2_5_Clicked方法中输入以下代码:
publicvoidCTRL2_5_Clicked(objectsender,ClickedEventArgse)
{
try
{
userName=e.Source.SelectSingleNode("//my:username",this.NamespaceManager).Value;
FileQueryConnectionconn=this.DataSources["getalbum"].QueryConnectionasFileQueryConnection;
conn.FileLocation="http://picasaweb.google.com/data/feed/base/user/"
userName
"?alt=rss&kind=album&hl=zh_cn&access=public";
conn.Execute();
this.ViewInfos.SwitchView("album");
}
catch
{
MessageBox.Show("Cannotconnecttoalbumofspecifieduser.");
}
}
下面简单地解释一下这段代码:
首先以XPath方式获取用户在username文本框中输入的值,将它存入变量userName;
然后获取辅助数据源getalbum的QueryConnection,并将它转换为实际类型FileQueryConnection,FileQueryConnection是XML文档数据源的数据连接类型。
接着就可以根据userName来为FileQueryConnection生成新的FileLocation路径了。
调用FileQueryConnection的Execute方法执行数据源,来获取辅助数据源中的数据,执行后,album相册中绑定到辅助数据源的数据也会得到更新;
最后调用表单的ViewInfos.SwithchView方法来切换到album视图。
仍然按F5来预览效果,首先显示的是login视图,我们输入一个Google Picasa Web Album的用户名(注意不是邮箱,是"http://picasaweb.google.com/username”中的username),点击View Albums按钮,InfoPath获取完数据之后,就会切换到album视图,这时就可以看到该用户的相册列表了。
还可以继续完善一下这个表单模板的功能,比如查看相册内容和单张照片。基本操作和代码都是一样的,就不赘述了。最终效果如下: