代码改变世界

访问工作流中Association 和 Initiation 表单的数据

2006-12-22 10:38  Windie Chai  阅读(1144)  评论(2编辑  收藏  举报

MSDN原文: http://msdn2.microsoft.com/en-us/library/ms566880.aspx

当工作流实例启动时,将会从用户处收集Association Initiation表单数据并存放到一个SPWorkflowActivationProperties 对象中, 可以通过OnWorkflowActivated 活动的WorkflowProperties 属性来访问这个对象.这个对象包含了每个工作流的基本信息,例如工作流定义XML文件中的数据,工作流Association Initiation 表单中的数据. 您可以将SPWorkflowActivationProperties 类型的变量指定给WorkflowProperties属性来在工作流中使用这些信息.

SPWorkflowActivationProperties 对象包含Windows SharePoint Services中每个工作流实例的标准属性集,包括 HistoryListId, ItemId, TaskListId, WorkflowId.

另外,这个对象还包含一些字符串属性,例如AssociationData InitiationData 自定义属性,分别用来存放工作流的Association Initiation信息.

针对用来收集数据的Microsoft Office InfoPath 表单, 这些属性返回符合表单架构的 XML 字符串. 如果要访问这些自定义属性,必须编码来分析XML字符串.

工作流开发人员可以决定使用什么样的方法来分析XML字符串和它包含的自定义属性.我们可以使用Microsoft Visual Studio 2005命令提示工具,运行xsd.exe来生成基于工作流架构的类文件;然后把SPWorkflowActivationProperties对象中InitiationData属性的XML字符串反序列化,就可以把表单转换成一个对象来使用.

访问工作流中的Association Initiation 表单数据

1.  生成InfoPath表单的架构文件.

a.     保存并发布InfoPath表单.

b.    然后将表单保存为源文件,单击文件菜单下的另存为源文件.选择一个用来存放表单源文件的位置,单击确定.

InfoPath 在指定的位置生成了一组包括架构文件在内的表单资源文件.表单架构文件的文件名是myschema.xsd.

2.  使用命令行工具运行xsd.exe来生成基于表单架构文件(.xsd)的类文件.

Microsoft Visual Studio 2005命令提示工具中运行下面的命令: xsd “架构文件路径” /c /o:”用于存放类文件的文件夹路径

补充:

1)     注意命令中的空格.

2)     用于存放类文件的文件夹路径是不以”\”结尾的路径,否则会报错,建议您把目标文件夹拖放到命令提示工具来自动填写路径.

 

xsd.exe工具生成一个基于表单架构的类文件.和架构文件类似,这个文件的文件名为myschema.cs. 这个文件中的类的名称和架构根元素的名称还有表单域组的名称是相同的.

提示:

为表单的域组指定一个唯一的名称,而不是采用默认的名称(myfields),这样做可以确保从架构文件生成的类也拥有一个唯一的名称.当您的工作流项目包含很多表单时这样做非常重要.

 

补充:

这点尤其要注意,由于域组的名称,表单架构根元素的名称和myschema.cs文件中的类名这三个名称是相同的,根据三者的生成顺序,如果要修改其名称,请依照以下的顺序进行:

1)     修改域组名称.

2)     保存并发布.

3)     重新生成架构文件.

4)     重新生成类文件.

笔者就因为直接修改类文件中的类名而导致工作流启动出错,排错花了很长时间,调试工作流时查看InitiationData属性中的XML字符串才找出原因.

3.    Visual Studio中打开您的工作流项目,将刚刚生成的类包括到项目中.

4.    通过使用Association Initiation 数据,在工作流中添加代码来得到新类的实例.

例如:下面的代码从名叫workflowPropsSPWorkflowActivationProperties对象的InitiationData属性中序列化了InitForm类型的一个新的对象. 这个例子假定开发人员已经为InfoPath表单架构文件生成了类InitForms.

using System.Xml.Serialization; 

using System.Xml; 

… 

XmlSerializer serializer 
= new XmlSerializer(typeof(InitForm)); 

XmlTextReader reader 
= new XmlTextReader(new System.IO.StringReader(workflowProps.InitiationData)); 

InitForm initform 
= (InitForm) serializer.Deserialize(reader); 

5.    添加代码通过访问类的属性来访问表单的域.

下面的代码访问了三个InitForm对象的自定义属性并把它们传给字符串变量.

assignee = initform.assignee; 
instructions 
= initform.instructions; 
comments 
= initform.comments;