您的位置:首页 > 编程语言

使用编程的方式来启动SharePoint的工作流

2011-11-24 15:15 423 查看
工作流是SharePoint很重要的一部分。我写的这篇文章是通过编程的方式启动工作流。一共分两个部分:启动无参数和有参数的工作流。

参考示例:http://www.sharepointkings.com/2008/09/how-to-pass-parameters-to-workflow.html

首先,通过SharePoint Designer 2010针对一个文档库设计两个工作流:

NameDescription
MyWorkflow没有参数
MyInitialDataWF三个参数:YourName(string); YourAge(Int); YourDate(DateTime)
首先看一下无参数工作流。

这个比较简单,直接使用SPWorkflowManager.StartWorkflow Method(http://msdn.microsoft.com/en-us/library/ms467505.aspx)来启动工作流,代码如下:

public void StartWorkflow(SPWeb web)
{
SPList testDocLib = web.GetList("TestDocLib");
SPListItem wfItem = testDocLib.GetItemById(2);

SPWorkflowAssociationCollection wfAssociationColls = testDocLib.WorkflowAssociations;
CultureInfo ci=CultureInfo.CurrentCulture;

SPWorkflowAssociation spWFAss =
wfAssociationColls.GetAssociationByName("MyWorkflow", ci);
Console.WriteLine(spWFAss.Name);
web.Site.WorkflowManager.StartWorkflow(wfItem, spWFAss, spWFAss.AssociationData, true);

}


接下来看一下启动带参数的工作流。这里唯一一个注意的地方就是这个参数是需要我们进行序列化的。

我们需要定义一个参数类:

[Serializable()]
public class WFParameters
{
public string YourName { get;set;}
public int YourAge{get;set;}
public DateTime YourDate { get; set; }

public string GetInitXmlString(WFParameters objParameters)
{
WFParameters wfData = new WFParameters();
wfData.YourName = objParameters.YourName;
wfData.YourAge = objParameters.YourAge;
wfData.YourDate = objParameters.YourDate;

using (MemoryStream stream = new MemoryStream())
{
XmlSerializer serializer = new XmlSerializer(
typeof(WFParameters));
serializer.Serialize(stream, wfData);
stream.Position = 0;
byte[] bytes = new byte [stream.Length];
stream.Read(bytes, 0, bytes.Length);
return Encoding.UTF8.GetString(bytes);
}
}

}


然后我们来传递这个参数给SPWorkflowAssociation.AssociationData

代码如下:

public void StartWorkflow(SPWeb web)
{
SPList testDocLib = web.GetList("TestDocLib");
SPListItem wfItem = testDocLib.GetItemById(2);

SPWorkflowAssociationCollection wfAssociationColls = testDocLib.WorkflowAssociations;
CultureInfo ci=CultureInfo.CurrentCulture;

SPWorkflowAssociation spWFInitialAss =
wfAssociationColls.GetAssociationByName("MyInitialDataWF", ci);

WFParameters objParameters = new WFParameters();
objParameters.YourName = "Jim";
objParameters.YourAge = 20;
objParameters.YourDate = DateTime.Parse("6/1/2009");
string serializedParameters = objParameters.GetInitXmlString(objParameters);

Console.WriteLine(serializedParameters);
spWFInitialAss.AssociationData=serializedParameters;
web.Site.WorkflowManager.StartWorkflow(
wfItem, spWFInitialAss, spWFInitialAss.AssociationData, true);
}


我们如果跟踪SPWorkflowAssociation.AssociationData这个参数,会发现是一个XML格式的字符串。如下:

<?xml version="1.0"?>
<WFParameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="h
ttp://www.w3.org/2001/XMLSchema">
<YourName>Jim</YourName>
<YourAge>20</YourAge>
<YourDate>2009-06-01T00:00:00</YourDate>
</WFParameters>


代码比较简单,没有加特别的说明。
拓展:在工作中,有时候我们会需要根据某一列的值发生变化时来启动工作流,这个时候的解决方案是通过Event Handler的方式来做逻辑的判断,然后启动工作流。这种时候,我们只需要在ItemUpdated等事件来添加以上代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐