用户在设计sharepoint工作流的任务表单时,若只需带出一些简单字段的初始值,通常采用辅助数据源的办法来实现,但是如果想要带出infopath重复表初始值就很困难了,因为辅助数据源不支持复杂的数据结构。

要解决此问题,只能通过对infopath任务表单添加初始化代码的方法了。

使用此方法,还必须对xml有一定了解,因为你的重复表中的数据就是xml,
思路是
1.仍旧需要定义辅助数据源,但是对重复表单部分,不用对重复表内的每个字段逐一定义对应字段,只用为重复表部分整体上定义一个就可以了。假如你的重复表最外一层的数据源为:data,
你的结构是:
data
datas
name
sex
age
datas
data
在辅助数据源中你可以定义ows_repeat 对应这个data,名字没有限制,而data里面的子字段就不用管了。
2.在你的工作流中产生重复表中需要xml内容,例如:strXMLofRepeat,仍旧通过Task1_Properties.ExtendedProperties[repeat]=strXMLofRepeat; 来赋值。
3.在设计任务表单时,选择工具-〉编程-〉loading事件
public void FormEvents_Loading(object sender, LoadingEventArgs e)
{
if (this.DataSources == null)
{
return;
}
XPathNavigator xmlSource = this.DataSources["ItemMetadata"].CreateNavigator();
XPathNavigator mydata = this.MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:data", NamespaceManager);
mydata.InnerXml = xmlSource.SelectSingleNode("/z:row/@ows_repeat", NamespaceManager).InnerXml;
}
4.任务表单发布时,要特别注意由于添加了代码,产生一个dll文件,这个dll文件也要发布到工作流模版所载的目录下。
这个dll文件的路径你可以通过infopath表单设计模式下工具->表单选项->编程-> Visual Basic 和C#代码项目位置这个地方找到,将它拷贝到你的工作流模版发布的目录中,假设你的工作流名称为mywf, 那么就拷到c:\program files\common files\microsoft shared\web server extensions\12\TEMPLATE\FEATUES\mywf目录中,然后iisreset一下。
如果记不住这个目录,那就等运行中报错吧,抱错时也会提示你这个目录的位置的。:)
正常情况下就可以了。

通常容易出错的是第二步,也就是你在工作流中要生成这个xml,这是最难的。

infopath对xml要求很严,字段结构不能有一点错误,包括大小写都不能搞错,也不能弄错名字空间的。 要解决这个问题的好办法先作本地测试,就是直接在infopath环境下通过F5测试,而不要在工作流中测试。

当然测试前要对源代码作一点修改:

你首先可以编写一个你最终想在工作流中产生的Xml字符串,如 string strmyXML = "<datas xmlns=\".....\"><name>zhangsan</name><sex>male</sex><age>18</age></datas>;"
将mydatas.InnerXml = xmlSource.SelectSingleNode("/z:row/@ows_repeat", NamespaceManager).InnerXml;
改成,mydatas.InnerXml = strmyXML; 
测试通过了之后再在真正的工作流环境中试验。

另外,这里简单提一下 innerXml outerXml innerText的区别

以刚才的将xml字符串
<datas xmlns=\".....\"><name>zhangsan</name><sex>male</sex><age>18</age></datas> 符给 任务表单为例:
对于data节点,它的 innerHtml 就是
<datas xmlns=\".....\"><name>zhangsan</name><sex>male</sex><age>18</age></datas>

它的outerhtml就是

<data><datas xmlns=\".....\"><name>zhangsan</name><sex>male</sex><age>18</age></datas></data>

它的innerText就是

zhangsanmale18

现在看出区别来了吗?