在自定义工作流程活动中使用OUT参数时出错

问题描述:

更新: 如何创建out变量?任何人都可以帮助我找出我在代码中做错了什么。我得到错误... 依赖项属性'ListItem'的ErrorType'System.Int32'与值类型'System.String'不匹配。 参数名:价值在自定义工作流程活动中使用OUT参数时出错

using System; 
using System.ComponentModel; 
using System.ComponentModel.Design; 
using System.Collections; 
using System.Drawing; 
using System.Linq; 
using System.Workflow.ComponentModel.Compiler; 
using System.Workflow.ComponentModel.Serialization; 
using System.Workflow.ComponentModel; 
using System.Workflow.ComponentModel.Design; 
using System.Workflow.Runtime; 
using System.Workflow.Activities; 
using System.Workflow.Activities.Rules; 
using Microsoft.SharePoint.WorkflowActions; 
using Microsoft.SharePoint; 
using Microsoft.SharePoint.Workflow; 
using System.Diagnostics; 


namespace TestEmailDistributionActivity 
{ 
    public partial class Activity1: SequenceActivity 
    { 
     EventLog _log = new EventLog("Email Distribution"); 
     SPList _list; 
     SPFieldUserValueCollection objUserFieldValueCol; 
     string semailsettingKeyword1; 
     string semailsettingKeyword2; 
     string sender; 
     string semailsubject; 
     string semailfrom; 
     string toField; 

     public Activity1() 
     { 
      InitializeComponent(); 
     } 
     public static DependencyProperty __ContextProperty = DependencyProperty.Register("__Context", typeof(WorkflowContext), typeof(Activity1)); 
     [DescriptionAttribute("__Context")] 
     [BrowsableAttribute(true)] 
     [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)] 
     public WorkflowContext __Context 
     { 
      get 
      { 
       return ((WorkflowContext)(base.GetValue(Activity1.__ContextProperty))); 
      } 
      set 
      { 
       base.SetValue(Activity1.__ContextProperty, value); 
      } 
     } 
     public static DependencyProperty ListIdProperty = DependencyProperty.Register("ListId", typeof(string), typeof(Activity1)); 
     [DescriptionAttribute("ListId")] 
     [BrowsableAttribute(true)] 
     [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)] 
     public string ListId 
     { 
      get 
      { 
       return ((string)(base.GetValue(Activity1.ListIdProperty))); 
      } 
      set 
      { 
       base.SetValue(Activity1.ListIdProperty, value); 
      } 
     } 
     public static DependencyProperty ListItemProperty = DependencyProperty.Register("ListItem", typeof(int), typeof(Activity1)); 
     [DescriptionAttribute("ListItem")] 
     [BrowsableAttribute(true)] 
     [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)] 
     public int ListItem 
     { 
      get 
      { 
       return ((int)(base.GetValue(Activity1.ListItemProperty))); 
      } 
      set 
      { 
       base.SetValue(Activity1.ListItemProperty, value); 
      } 
     } 
     public static DependencyProperty RecipientsProperty = DependencyProperty.Register("Recipients", typeof(string), typeof(Activity1)); 
     [DescriptionAttribute("Recipients")] 
     [BrowsableAttribute(true)] 
     [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)] 
     public string Recipients 
     { 
      get 
      { 
       return ((string)(base.GetValue(Activity1.RecipientsProperty))); 
      } 
      set 
      { 
       base.SetValue(Activity1.ListItemProperty, value); 
      } 
     } 
     protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) 
     { 

      _log.Source = "Share Point Workflows"; 
      // _log.WriteEntry("Code entered into Excute Method"); 
      try   
      {     
       //Execute method as a elevated method 
       SPSecurity.CodeToRunElevated elevatedExecuteMethod = new SPSecurity.CodeToRunElevated(ExecuteMethod); 
       SPSecurity.RunWithElevatedPrivileges(elevatedExecuteMethod); 
      }   
      catch (Exception ex)  
      {   
       _log.WriteEntry("Error" + ex.Message.ToString(), EventLogEntryType.Error); 
      } 
      return ActivityExecutionStatus.Closed; 
     } 
     private void ExecuteMethod() 
     { 
      // _log.WriteEntry("Code entered into ExcuteMethod()"); 
      //retrieveing the Site object  
      SPSite _site = new SPSite(__Context.Site.ID); 
      //retrieveing the Web object    
      //SPWeb _web = (SPWeb)(__Context.Web); 
      SPWeb _web = _site.OpenWeb(__Context.Web.ID); 
      //retrieveing the list object   
      _list = _web.Lists[new Guid(this.ListId)]; 
      //retrieveing the list item object   
      SPListItem _listItem = _list.GetItemById(this.ListItem); 
      try 
      { 
       using (SPSite mysite = new SPSite("http://dlglobaltest.dl.com/Admin/IT/Application%20Development%20Group/TestEmailDistribution")) 
       { 
        using (SPWeb myweb = mysite.OpenWeb()) 
        { 
         _log.WriteEntry("message from activity"); 
         semailsubject = _listItem["E-Mail Subject"].ToString(); 
         semailfrom = _listItem["emalfrom"].ToString(); 
         SPList settingsList = myweb.Lists["Settings"]; 
         //SPListItem _settingslistItem = settingsList.GetItemById(this.ListItem); 
         //string sender = _settingslistItem["Sender"].ToString(); 
         SPQuery oQuery = new SPQuery(); 
         oQuery.Query = "<Where><Contains><FieldRef Name='Sender' /><Value Type='Text'>[email protected]</Value></Contains></Where>"; 
         SPListItemCollection ColListItems = settingsList.GetItems(oQuery); 
         foreach (SPListItem oListItem in ColListItems) 
         { 
          semailsettingKeyword1 = oListItem["Keyword1"].ToString(); 
          semailsettingKeyword2 = oListItem["Keyword2"].ToString(); 
          sender = oListItem["Sender"].ToString(); 
          //SPFieldUserValue objUserFieldValue = new SPFieldUserValue(myweb, oListItem["Recipients"].ToString()); 

          if ((semailsubject.Contains(semailsettingKeyword1)) || (semailsubject.Contains(semailsettingKeyword2))) 
          { 
           objUserFieldValueCol = new SPFieldUserValueCollection(myweb, oListItem["Recipients"].ToString()); 
           for (int i = 0; i < objUserFieldValueCol.Count; i++) 
           { 
            toField = objUserFieldValueCol[i].User.Email; 
            this.Recipients = toField.ToString();//**getting the error here.** 

           } 
           _log.WriteEntry(toField); 

          } 
         } 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       _log.WriteEntry("Error" + ex.Message.ToString(), EventLogEntryType.Error); 
      } 

     } 
    } 
} 

操作文件:

<Action Name="get Recipients" 
      ClassName="TestEmailDistributionActivity.Activity1" 
      Assembly="TestEmailDistributionActivity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ef7ee5e33fadc78e" 
      AppliesTo="all" Category="Custom"> 
     <RuleDesigner Sentence="get all column values from %1 and %3 from Settings list"> 
      <FieldBind Field="ListId,ListItem" Text="this list" Id="1" DesignerType="ChooseListItem" /> 
      <FieldBind Field="Recipients" Text="get Recipients" Id="1" DesignerType="ParameterNames" /> 
     </RuleDesigner> 
     <Parameters> 
      <Parameter Name="__Context" Type="Microsoft.SharePoint.WorkflowActions.WorkflowContext" Direction="In" /> 
      <Parameter Name="ListId" Type="System.String, mscorlib" Direction="In" /> 
      <Parameter Name="ListItem" Type="System.Int32, mscorlib" Direction="In" /> 
      <Parameter Name="Recipients" Type="System.String, mscorlib" Direction="Out" /> 
     </Parameters> 
    </Action> 

感谢,

这段代码是错误的:

SPSite _site = new SPSite(__Context.Site.Url); 
SPWeb _web = (SPWeb)(__Context.Web); 

当在高温情况下工作,你必须重新 - 创建网站和网站。您已重新创建网站,但不是网站。因此,网络可能引用了错误情况下的网站。

我通常只是做(确保你处置的对象在使用)

SPSite _site = new SPSite(__Context.Site.Id); 
SPWeb _web = _site.OpenWeb(__Context.Web.Id); 
+0

我已根据您的建议修改了代码,现在我正试图对该值进行硬编码。现在一切正常,但我不知道如何在代码中使用out参数。我更新了我的代码。 – user346514 2011-01-31 21:09:02

从user346514几乎工作的代码,只是要注意:

public string Recipients 
     { 
      get 
      { 
       return ((string)(base.GetValue(Activity1.RecipientsProperty))); 
      } 
      set 
      { 
       base.SetValue(Activity1.ListItemProperty, value); 
      } 
     } 

必须是:

public string Recipients 
     { 
      get 
      { 
       return ((string)(base.GetValue(Activity1.RecipientsProperty))); 
      } 
      set 
      { 
       base.SetValue(Activity1.RecipientsProperty, value); 
      } 
     } 

另外,在ACTIONS文件上:

<RuleDesigner Sentence="get all column values from %1 and %3 from Settings list"> 
      <FieldBind Field="ListId,ListItem" Text="this list" Id="1" DesignerType="ChooseListItem" /> 
      <FieldBind Field="Recipients" Text="get Recipients" Id="1" DesignerType="ParameterNames" /> 
     </RuleDesigner> 

必须是这样的:

<RuleDesigner Sentence="get all column values from %1 and %2 from Settings list. Store result on %3."> 
       <FieldBind Field="ListId,ListItem" Text="this list" Id="1" DesignerType="ChooseListItem" /> 
<FieldBind Field="ListId2,ListItem2" Text="this list" Id="2" DesignerType="ChooseListItem" /> 
<FieldBind Field="Recipients" Text="get Recipients" Id="3" DesignerType="ParameterNames" /> 
      </RuleDesigner> 

%1,%2%3应匹配,并在相同的顺序。 这些字段也必须定义,但不需要相同的顺序。

我知道这是一个旧帖子,但只是为了防止某人需要带有OUT参数的工作流活动的示例。