InfoPath开发实战(2):获取XML文件中的数据

本节的内容:

  • 如何在InfoPath中使用数据连接来从XML文件中获取数据
  • 如何通过代码来修改数据连接中的XML文件路径

打开Visual Studio 2008,以“InfoPath 2007表单模板”为项目模板新建一个项目。

项目创建完后,就会看到一个空空如也的mainifest.xsf文件,这就是InfoPath表单的设计区域,我们可以使用“工具箱”和“版式”面板来设计表单。

我们先不急于设计表单,而是添加一个数据连接。为了让示例更加有趣,我选择了Google Picasa Web Album的RSS作为外部数据,InfoPath表单将从RSS文件中获取相册列表并呈现出来。

添加此数据连接的方法如下:

  1. 在“数据源”面板中点击“管理数据连接”;
  2. 在弹出的“数据连接”对话框中点击“添加”;
  3. 在弹出的“数据连接向导”对话框中选择“新建连接”和“仅接收数据”,点击“下一步”;
  4. 选择“XML文档”作为数据源,点击“下一步”;
  5. 在XML位置文本框中输入一个Google Picasa Web Album的相册RSS地址,点击“下一步”;
  6. 选择“从指定位置访问数据”,点击“下一步”;
  7. 输入名称“getalbum”,勾选“在打开表单时自动检索数据”,点击“完成”。

此时在打开“数据源”面板,将数据源切换为刚才创建“getalbum(辅助)”,会看到InfoPath已经导入了该RSS文件的架构。

infopath-xml-datasrouce-1

我们知道,RSS中表示具体条目的元素是item,在上图所示的RSS架构中,item元素被正确的识别为一个“重复项”。

接下来我们来添加一些控件并绑定到item及其子元素上,藉此来显示所有的相册,方法如下:

  1. 点击item元素旁的下箭头按钮,在其上下文菜单中选择【重复节】,这会在mainifest.xsf文件的设计界面中添加一个重复节控件,并且该控件绑定到了getalblum数据源的item元素上;
  2. 将光标定位到重复节控件内部,然后在“数据源”面板中选中item的子元素title,在其上下文菜单中点击【其他】;
  3. 在弹出的“选择控件”对话框中选择“表达式框”,点击“确定”,这会在重复节中添加一个用于显示相册标题的表达式框控件,并且该控件绑定到了item/title上。
  4. 将光标定位到重复节控件内部,然后在“数据源”面板中依次展开item/media:group/thumbnail,选中thumbnail的子元素url,在其上下文菜单中点击【其他】;
  5. 在弹出的“选择控件”对话框中选择“图片”,点击“确定”,这会在重复节中添加一个用于显示相册缩略图的图片控件,并且该控件绑定到了item/media:group/thumbnail/url上。

然后回到mainifest.xsf文件的设计界面中,简单的调整一下控件的尺寸,使其看起来如下图所示:

infopath-xml-datasrouce-2

然后按F5键运行,可以看到InfoPath已经正确获取并显示了Google Picasa Web Album的相册列表:

infopath-xml-datasrouce-3

效果看起来很棒,但到此为止,我们还没有编写一行代码。然而本例目前还只能读取我的Google Picasa Web Album的相册列表,下面我们来编写几行代码,把它改进成为一个InfoPath版的Google Picasa客户端浏览器。

具体步骤如下:

  1. 在“视图”面板中,选中唯一的视图,点击“视图属性”,在弹出的“视图属性”对话框中将视图名称修改为album;
  2. 在“视图”面板中,点击“添加新视图”来新建一个名为login的视图;
  3. 选中login视图,单击右键,选择【设为默认值】;
  4. 在login视图中添加一个名为username的文本框控件;
  5. 在login视图中添加一个标签为View Albums的按钮控件;
  6. 简单地调整一下login视图的版式,使其看起来如下图所示:
    infopath-xml-datasrouce-4
  7. 然后右键单击View Albums按钮,选择【“按钮”属性】;
  8. 在弹出的“按钮属性”对话框中点击“编辑表单代码”按钮,这会在FormCode.cs中生成一个CTRL2_5_Clicked方法(你的方法名称或许会和我的稍有不同)。
  9. 在FormCode.cs中定义一个全局变量:string userName;
  10. 在CTRL2_5_Clicked方法中输入以下代码:

public void CTRL2_5_Clicked(object sender, ClickedEventArgs e)
{
try
{
userName = e.Source.SelectSingleNode("//my:username", this.NamespaceManager).Value;
FileQueryConnection conn = this.DataSources["getalbum"].QueryConnection as FileQueryConnection;
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("Cannot connect to album of specified user.");
}
}

下面简单地解释一下这段代码:

  • 首先以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视图,这时就可以看到该用户的相册列表了。

还可以继续完善一下这个表单模板的功能,比如查看相册内容和单张照片。基本操作和代码都是一样的,就不赘述了。最终效果如下:

infopath-xml-datasrouce-5

示例源码:点击下载GooglePicasaWithInfoPath.rar

One Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注