代码改变世界

WF 自定义活动开发常见问题(进入第二个流程状态,数据传递失败的解决方法)

2009-10-16 12:50  Fred-Xu  阅读(543)  评论(0编辑  收藏  举报
这篇博文主要讲一下博主在开发自定义活动时候遇到的问题以及相应的解决方法,首先我们看工作流图:

在创建工作流的时候(也就是上图中第一个State)我们可以使用如下代码:
/// <summary>
        
/// 建立工作流
        
/// </summary>
        
/// <param name="workflowID"></param>
        
/// <param name="startParameter"></param>
        
/// <returns>Guid</returns>
        public Guid NewWorkflow(string workflowID, TmTpProject startParameter)
        {
            Dictionary
<stringobject> inputParameters = new Dictionary<stringobject>();
            inputParameters.Add(
"ProjectData", startParameter);

            
//启动一个新的工作流
            WorkflowInstance workflowInstance = wfRuntime.CreateWorkflow(typeof(TcShare.Workflow.ProjMgrWorkflow), inputParameters);
            workflowInstance.Start();

            return workflowInstance.InstanceId;
        }
这段代码会初始化工作流实例,持久化当前工作流,并返回当前工作流实例的Guid。
随后我们进行第二个流程状态,进行操作,例如我们执行一下代码:
        public void ProjCheckApprove(TmTpCheck model)
        {
            WorkflowInstance instance 
= wfRuntime.GetWorkflow(model.guid);
            
//WorkflowInstance instance = GetWorkflowByID(model.guid);
            ProjWorkflowService wfService = wfRuntime.GetService<ProjWorkflowService>();
            wfService.RaiseProjectApprove(model);
        }
做一个审核通过操作,传进来一个数据实体,并且确保已经配置好自定义活动中的数据属性,如图:

注意:在一个EventDrivenActivity中加入一个自定义活动,必须在之前放入一个handleExternalEventActivity!
做好此步骤,程序可能会出现几个错误:
1.自定义活动属性为Null,然后报错;

原因是因为该handleExternalEventActivity没有执行Invoked,也没有赋值给工作流内部的数据实体(关于这个问题大家可以浏览”WF GetRuntimeValue 错误的解决方法123“)
一定要做以下参考代码:
public sealed partial class ProjMgrWorkflow : StateMachineWorkflowActivity
    {
        
#region Public Data 公共数据实体

        
private TmTpProject internalProjectData;
        
public TmTpProject ProjectData
        {
            
get { return internalProjectData; }
            
set { internalProjectData = value; }
        }

        
private TmTpCheck internalCheckData;
        
public TmTpCheck ProjectCheckData
        {
            
get { return internalCheckData; }
            
set { internalCheckData = value; }
        }

        
private TmPpPhase internalPhaseData;
        
public TmPpPhase ProjectPhaseData
        {
            
get { return internalPhaseData; }
            
set { internalPhaseData = value; }
        }

        
#endregion

        
public ProjMgrWorkflow()
        {
            InitializeComponent();
        }

        
/// <summary>
        
/// 审核项目通过
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void handleCheckApproveExternalEventActivity_Invoked(object sender, ExternalDataEventArgs e)
        {
            tm_tp_checkEventArgs checkEventArgs 
= (tm_tp_checkEventArgs)e;
            internalCheckData = new TmTpCheck();
            internalCheckData 
= checkEventArgs.tm_tp_checkDataProperty;
        }
    }
这段代码的意思是把传进来的数据实体赋值给工作流的内部数据实体,内部数据实体其实就是绑定给了自定义活动的属性,这样子,自定义活动的属性就不会报错说Null啦。

如果大家也遇到同样的问题,但没有看明白该博文的话,可以联系我,进行交流沟通。

ps.博主刚刚开始接触wwf,博文里难免会出现一些表达上和认识上的偏差,希望各位能够予以指出和批评。谢谢。