您的位置:首页 > 运维架构

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

2009-01-19 08:38 218 查看
本节的内容:

如何在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方法中输入以下代码:

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

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



示例源码:点击下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: