Wednesday, March 28, 2007

SPD Workflow activity : Copying a listItem accros a site

*Update* Download the solution here

In addition to my previous post I also created a custom workflow activity for Sharepoint Designer where a listitem can be copied accros a site and/or to a list that is not available during the creation of the workflow but will be when the workflow is executed (using workflow variables).

 

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Diagnostics;
using System.Drawing;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
using Microsoft.SharePoint;
 
namespace CopyListItemExtended
{
    public partial class List: SequenceActivity
    {
        private EventLog _eventLog;
 
        public static DependencyProperty ListItemIDProperty = 
DependencyProperty.Register("ListItemID", typeof(string), typeof(List));
        public static DependencyProperty SrcUrlProperty = 
DependencyProperty.Register("SrcUrl", typeof(string), typeof(List));
        public static DependencyProperty DstUrlProperty = 
DependencyProperty.Register("DstUrl", typeof(string), typeof(List));
        public static DependencyProperty SrcListNameProperty = 
DependencyProperty.Register("SrcListName", typeof(string), typeof(List));
        public static DependencyProperty DestListNameProperty = 
DependencyProperty.Register("DestListName", typeof(string), typeof(List));
 
 
        [ValidationOption(ValidationOption.Required)]
        public string SrcUrl
        {
            get
            {
                return (string)base.GetValue(SrcUrlProperty);
            }
            set
            {
                base.SetValue(SrcUrlProperty, value);
            }
        }
 
        [ValidationOption(ValidationOption.Required)]
        public string DstUrl
        {
            get
            {
                return (string)base.GetValue(DstUrlProperty);
            }
            set
            {
                base.SetValue(DstUrlProperty, value);
            }
        }
 
        [ValidationOption(ValidationOption.Required)]
        public string SrcListName
        {
            get
            {
                return (string)base.GetValue(SrcListNameProperty);
            }
            set
            {
                base.SetValue(SrcListNameProperty, value);
            }
        }
 
        [ValidationOption(ValidationOption.Required)]
        public string DestListName
        {
            get
            {
                return (string)base.GetValue(DestListNameProperty);
            }
            set
            {
                base.SetValue(DestListNameProperty, value);
            }
        }
 
        [ValidationOption(ValidationOption.Required)]
        public string ListItemID
        {
            get
            {
                return (string)base.GetValue(ListItemIDProperty);
            }
            set
            {
                base.SetValue(ListItemIDProperty, value);
            }
        }
 
        protected override ActivityExecutionStatus 
Execute(ActivityExecutionContext executionContext)
        {
            //Set up the Event Logging object 
            _eventLog = new EventLog("Workflow");
            _eventLog.Source = "SharePoint Workflow";
 
            try
            {
                //Send the email 
                Copy();
            }
            finally
            {
                //Dispose of the Event Logging object 
                _eventLog.Dispose();
            }
 
            //Indicate the activity has closed 
            return ActivityExecutionStatus.Closed;
        }
 
 
        private void Copy()
        {
            SPSite srcSite = new SPSite(SrcUrl);
            SPWeb srcWeb = srcSite.OpenWeb();
 
            SPSite dstsite = new SPSite(DstUrl);
            SPWeb dstweb = dstsite.OpenWeb();
 
 
            string error = string.Empty;
 
            try
            {
                SPList destList = dstweb.Lists[DestListName];
                SPListItem item = srcWeb.Lists[SrcListName].GetItemById(Convert.ToInt32(ListItemID));
                item.CopyTo(dstweb.Url.ToString() + "/" + destList.Title.ToString() + 
"/" + item.File.Name.ToString());
                _eventLog.WriteEntry("Worklow succes: Item : " + item.Title.ToString() 
+ " has been succesfully copied from : " + srcWeb.Lists[SrcListName].Title.ToString()
+ " to : " + destList.Title.ToString());
 
            }
            catch (System.Exception Ex)
            {
                //Log exceptions in the Event Log 
                _eventLog.WriteEntry("Workflow Error :" + Ex.Message.ToString() 
+ error.ToString(), EventLogEntryType.Information);
            }
 
            finally 
            {
                srcWeb.Close();
                srcWeb.Dispose();
                srcSite.Close();
                srcSite.Dispose();
 
                dstweb.Close();
                dstweb.Dispose();
                dstsite.Close();
                dstsite.Dispose();
            }
        } 
 
 
        public List()
        {
            InitializeComponent();
        }
 
 
    }
}


And the including XML chunk that needs to be added in WSS.ACTIONS:

<Action Name="Copy List Item Extended"

ClassName="CopyListItemExtended.List"
Assembly="CopyListItemExtended, Version=1.0.0.0, Culture=neutral, PublicKeyToken=54d1a6fdf526a294"
AppliesTo="all"
Category="Sample">
  <RuleDesigner Sentence="Copy List %1 from this %2 to this %3 and from this %4 to this %5.">
    <FieldBind Field="ListItemID" Text="ItemID" DesignerType="TextArea" Id="1"/>
    <FieldBind Field="SrcUrl" Text="Source Site" DesignerType="TextArea" Id="2"/>
    <FieldBind Field="DstUrl" Text="Destination Site" DesignerType="TextArea" Id="3"/>
    <FieldBind Field="SrcListName" Text="Source List" DesignerType="TextArea" Id="4" />
    <FieldBind Field="DestListName" Text="Destination List" DesignerType="TextArea" Id="5" />
  </RuleDesigner>
  <Parameters>
    <Parameter Name="ListItemID" Type="System.String, mscorlib" Direction="In" />
    <Parameter Name="SrcUrl" Type="System.String, mscorlib" Direction="In" />
    <Parameter Name="DstUrl" Type="System.String, mscorlib" Direction="In" />
    <Parameter Name="SrcListName" Type="System.String, mscorlib" Direction="In" />
    <Parameter Name="DestListName" Type="System.String, mscorlib" Direction="In" />
  </Parameters>
</Action>

54 comments:

Robert W. Crouch said...

I am still working to understand your post, but it is exactly what I needed. I have one question. I assume that this entire workflow still runs in the context of the current user, but what if I wanted someone to add an item to a temporary list, and then have workflow copy it to an internal "private" list. How would you go about elevating permissions temporarily to allow the copy process to proceed?

Robin Meuré said...

Hi Robert,

I'm glad that you find my post usefull :) To answer your question, yes are correct about the context of the current user. But you can easily impersonate in Sharepoint 2007. Just add the following code

SPSite site = new SPSite("SiteCollection_Url");
SPWeb web = site.OpenWeb();
SPUser user = web.AllUsers["User_Name"];

SPUserToken token = user.UserToken;
SPSite impersonatedSiteCollection = new SPSite("SiteCollection_Url", token);

(taken from http://www.sharepointblogs.com/mirjam/archive/2006/11/02/15669.aspx)

between the copy process.

Anonymous said...

Robin,

Great post! I too will make use of it - once I understand all the pieces. At the top of the post you say that this is a "custom activity for SharePoint Designer". Can you point me in a direction where I can read/learn about how you: (1) Build activities and (2) Integrate a custom activity into SharePoint Designer. I thought any custom stuff had to be done in Visual Studio and deploye to the SP site. It sounds like you're saying I can integrate a custom activity into the SharePoint Designer.

Thanks,
Kevin S

Robin Meuré said...

Hi Kevin,

yes you understand it right, you can build custom Workflow activities in VS2005 and use them in Sharepoint Designer.

Basically what Sharepoint Designer does when you open up a site, it fetches all the relevant details from the site (site hierarchy, templates, themes and also custom workflow activities)

All I did was use the post of Todd Baginski which I mention in my post to create my workflow for Sharepoint Designer. Since I also never had any experience coding workflows I think this is sufficient for you as well :)

Sridhar Usha said...

Hi Robin,
This is the exact functioanlity i wanted to implement in my intranet.
thanks a lot. However I am trying to bind the Current List Item Id in SPD to the List Item Id and I keep getting Object Null Reference exceptions.
I even added "UsesCurrentItem" property in wss.actions file and also pulled __listId parameter
However Iam still not able to figure this out Any Ideas??

Robin Meuré said...

Can you post the code? Or does my code not work?

Sridhar Usha said...

I have used the exact code you had posted creating the project and deploying it using Todd's blogpost.
I have successfully deployed it in GAC and iam able to see the activity in SPD. I had to disable the eventlog entries as I was getting registry access errors.
Can you tell my what I would enter in the ListItemId parameter in SPD .My aim is to send the current List item's id and Iam not sure it is getting propagated. Thanks for your help

Robin Meuré said...

You should use the "Current Item" in the DropDown and then the "ID" field.

Anonymous said...

When I try to build the code for your workflow activity, I get an error on the last line re: InitializeComponent(). This is the error:

Error 1 The name 'InitializeComponent' does not exist in the current context C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\CopyListItemExtended\CopyListItemExtended\CopyListItemExt.cs 161 13 CopyListItemExtended

Robin Meuré said...

@anonymous, check the update to download the solution.

Erik Breuker said...

To extend this post, you could mension that it's also possible to use the Sharepoint Lists Web Service in the code of the custom activity.

using this webservice, it's possible to copy, update or delete a ListItem on another portal (if you have the credentials of course). Just use an SPQuery object with a CAML query.

Anonymous said...

I'm trying to use your workflow activity on a document library to copy a document to another library on another site. But I don't know if I'm doing something wrong. The workflow is started but the file is not being copied. I'm not sure if I have filled in the properties for ItemID, Source Site, Destination Site, Source List and Destination List correctly. Can you maybe give an example of how it would look when the fields are filled in. For example, should the site be written like a URL, "http://sitename"?

Thanks,
Maja

Alex Talarico said...

This code does not work - at least not for lists :)

It is worth noting that your post title says "Copying a listItem accross a site" - instead, this code was written to work only on document libraries.

Notice the code part:

item.CopyTo(dstweb.Url.ToString() + "/" + destList.Title.ToString() +
"/" + item.File.Name.ToString());


this destination URL inside the CopyTo method translates to:

http://serverSiteUrl/destList/itemName

This is not going to work for Lists because the expected URL reads differently with Lists:

http://serverSiteUrl/Lists/destList/DispForm.aspx?ID=itemID (not itemName like the code gets)

Even after changing the URL, the code would fail using the CopyTo method if there are field mismatches and/or attachments on the list item..

I wrote the following code for now which you can base from if you wish to use this SPD activity on List items:


SPList destList = dstweb.Lists[DestListName];

SPListItem item = srcWeb.Lists[SrcListName].GetItemById(Convert.ToInt32(ListItemID));

SPListItem newItem = destList.Items.Add();

foreach (SPField f in item.Fields)
{
if (!f.ReadOnlyField)
{
try { newItem[f.Title] = item[f.Title]; }
catch { /*some fields cannot be udpated*/ }
}
}

newItem.Update();


This code works if you need this Activity to work in SharePoint lists.

If you want to make your code more dynamic I recommend checking the type of the list particularly if it is of type SPDocumentLibrary or SPList or other... and handle the item add logic in different helper methods, which would get called depending on the type of list retrieved. This is a bit out of scope for this post, but ... you get the idea ;-)

Robin Meuré said...

Hi Alex,

You are right that I wrote this for document libraries specifically. Although it wouldn't make sense if it didn't work for listitems as a doclib is nothing more then an enhanced list (as you say in the part where you need to make an adjustment to the url to include the ../lists/.. bit ;)

Thanks for the code example to make it work for using it if fields don't match between the two lists!

Bill Riskas said...

Hi Robin,

Does this activity - with the changes in order to work for a list - copies attachments too???
What i need is to copy the whole list item with it's attachments....

Thanks

Robin Meuré said...

Hi Bill,

sorry for the late reply, but yes that is possible. I think if you use the listitem.CopyTo function it will automically copy the attachment fields as well.

And if not than you will need to check out MSDN page or look here

Anonymous said...

Hi Robin,

Thanks for a very useful and helpful post. I am trying to copy the SPListItemVersion collection when I copy across a SPListItem object. Unfortunately I can't use MoveTo since the copy is across sites. Have you got any ideas on the best way of doing this? (without doing it in the database).

Thanks!
George

Robin Meuré said...

Hi George,

so I reckon if you copy the list item the versions are not included?

Anonymous said...

Hi Robin,

Thanks for the reply. I did figure it out eventually (with the help of other another post).

The trick was I had to look at the SPFileVersion object and use its OpenBinary method. Also if you need to get the verion of the historic item, parse the VersionLabel property.

Thanks,
George

Anonymous said...

Hello Robin,

I have the same question as Bill. I'm trying to copy the attachment from 1 list to another and I can't seem to do it (other fields are ok). I'm using SPD not Visual Studio.. any ideas? Thanks..

Anonymous said...

I installed this into the GAC and for some unknown reason cannot see it display within the 'Actions' within SPD when selected.

Can you help?

Robin Meuré said...

Did you modify the existing wss.actions file or did you create a new one?

Any errors in the eventviewer of the server?

Robin Meuré said...

About copying attachments from a listitem. You will have to open up the attachmentcollection of that particular listitem and create a new one for the copied item.

Anonymous said...

I installed this into the GAC and for some unknown reason cannot see it display within the 'Actions' within SPD when selected.

I checked the event viewer and there was no errors reported. I had modified the wss.actions.

One thing I did notice is their is a disparity between the code, wss.actions template and the download you posted. For example, the code references CopyListItemExtended yet the download assemply is just CopyListItem.

Could you provide an update? Or am I going crazy here...

Many thanks,

-jb

Pham Hoang said...

Hi Robin,

I'm very interested in your workflow activity, that's what I really need. But following your post, I encounted the same problem with Maja: I'm trying to use your workflow activity on a document library to copy a document to another library on another site. I don't know how to fill in the properties for ItemID, Source Site, Destination Site, Source List and Destination List correctly. Can you maybe give an example of how it would look when the fields are filled in. For example, should the site be written like a URL, "http://sitename"?

Robin Meuré said...

Hi,

the input for the fields are :
SrcSite = "http://servername/sites/sitename"
DstSite = "http://servername/sites/sitename"
SrcList = "ListName" (eg. DocumentLibrary)
DstList= "ListName"
ItemID = Current Item > ID (in SPD)

Hope this helps and I will update this post with this information soon ;)

George said...

Hi Robin,

I am having difficulty adding a 'Reapting section' with a 'File Attachment' control (to a InfoPath 2007 task form). The problem I am having, is that on selecting the file and uploading it, it displays correctly and on the onTask0Changed_Invoked of the work flow the task0AfterChangeProperties.ExtendedProperties["FileGroup"] contain the appropriate Xml.

But on opening the Task a second time, the files are not displayed inside the control.

The Repeating control is bound to "Files" (repeating folder), which contains a "FileAttachment" (base64). And the parent of the File is "FileGroup" (folder).
eg
myFiels (parent folder of "Main" data source)
->FileGroup (folder)
-> Files (folder repeating)
->FileAttachment (base 64)

The submit button has a rule which submits data To Host.

Any help would be appreciated! (I've looked all over the net and I can't seem to find any examples of people using the FileAttachment control on a browsable InfoPath form.

Thanks heaps,
George

Pham Hoang said...

Hi Robin,
I followed your instruction above but nothing was happened. My document wasn't copied to another document library on another site.
My workflows sentence:
If Approval Status equals 0;#Approved
Copy List Vanban:ID from this http://ho-sps01/sites/HO/phong_tin_dung to this http://ho-sps01/sites/HO/vanphong and from this Vanban to this VanbantrinhBLD

Could you pls help me to resolve this problem.
Thanks so much!

Pham Hoang said...

In the Event Viewer. there's an error:
Workflow Error :Cannot create an item at the requested destination. Verify that the folder exists and that you have permission to edit in it.

Could you show me what the problem is

Lubna said...

Hi Robin,

Thank your for this useful blog. I have a question. I created a workflow using SharePoint designer. The workflow is initiated once the user adds a list item. The workflow is supposed to copy the list item to a "restricted" list. This is the area were i run into problems. From what i have read, it appears that SPD Workflows will only run in the context of the current user. However, i want it to run in the context of another user. Is this possible in sharepoint designer? and If so then how?. Thanks.

Robin Meuré said...

Hi Lubna,

have you tried the code that I mentioned in the 2nd comment?

"SPSite site = new SPSite("SiteCollection_Url");
SPWeb web = site.OpenWeb();
SPUser user = web.AllUsers["User_Name"];

SPUserToken token = user.UserToken;
SPSite impersonatedSiteCollection = new SPSite("SiteCollection_Url", token); "

?

PEDRO ALBERTO said...

Hi friends. I have set up Sharepoint Server 2007 successfully, and afterwards I have set up Sharepoint Designer. I need to create a workflow, but SPD has no "workflow" option under its "new" option, and the web site tab, in its sharepoint templates, is empty. Is it missing anything on the set up? Thank you for your attention.

Robin Meuré said...

Hi Pedro,

did you open up a site first before trying to create a new workflow?
Otherwise a new workflow cannot be created using SharePoint Designer. A workflow is bound to a specific site and a specific list so in order to create one you must have openend a web/site first :)

Lubna said...

Thanks Robin.

I am not sure where this code is placed if my workflow is created in SharePoint Designer.

Robin Meuré said...

Hi Lubna,

I was assuming you used a custom workflow instead of a SPD one, sorry about that :) But for all I know is that the System Account is being used to execute the workflows itself. So it would make sense that an item gets copied with that account as well right?

Lubna said...

Robin,

Thank you for the quick response. Actually from researching I have found out that SPD workflows will run in the context of the initiator, which is a major drawback. Some bloggers have mentioned that this will be fixed in SP1. Are you aware of this issue?

Dez said...

Similar to a few other posters, I have a need to perform a workflow under the context of a user that higher level priviledges that the currently logged in user.

Our situation is this:
We have a document library that is used as a "working" area for draft documents. It has versioning turned on so that submitted documents are viewable only by the submitter (creator) and the site owner. This is neccessary because we dont want users modifying any documents other than their own. Once they upload (or modify an existing) document to the library, we need to have a workflow fired off that takes a copy of the document and places it in another library where all users have "read" access only. This is neccessary so that all users can view the draft versions of everyone else.

The problem, is that the simple workflow I've created in SP Designer to accomplish this will fail because the user that uploads a document to the draft library, does not have permission to upload to the public library...this of course happens because the workflow runs under the context of the currently logged in user (or more appropriately, runs under the context of the user that initiated the workflow). This I understand, and although I think it was a major flaw in the logical design by Microsoft, I do get it.

So, because of this, I need to either develop a custom VS workflow to handle this so I can run it under elevated priviledges to allow for the copy to work, or I need to figure out how to attach a custom "chunk" of code (with the elevated priviledges wrapper around the copy portion) to my existing SP Designer workflow...both of which, I just cant figure out how to do.

I just stumbled accross your post recently, and after reading through things...it appears that you may have the solution I'm looking for...I just still cant seem to figure out how to implement this.

- Dez

David said...

Thank you for your post; it's been uber helpful!!

However... I'm trying to utilize the "ECM Activities" sample (specifically the SendToRecordsRepository activity) from the MOSS SDK and am running into the failure that was mentioned on the MSDN blog - "Tip: the most common pitfall is adding a .ACTIONS or web.config entry which doesn’t exactly match your custom DLL. If you find that the action shows up in SPD, but nothing appears when it is selected, verify that the entries you’ve made match the activity class exactly."

I've checked my assembly and the class are being correctly stated in the .ACTIONS file. Have you heard of anyone else running into problems (selecting the activity in SPD does nothing) utilizing the same activity/assembly in SPD?

Lubna said...

Hi Robin,

I would like your help regarding the following issue. I have recently created a customized visual studio workflow which copies a newly added list item to another list, deletes the item in the source list, and sends an email. It works fine however i noticed that the workflow always fails the first time i run it after adding it to the list or even changing a setting. Please note that the document gets copied to the destination list however the delete and email activities do not happen. Your help in this issue is greatly appreciated.

sabyasachi said...

Hi Robin
Great post this is exactly
what i needed,i copied your code but while building the project i am getting an error like "InitializeComponent" does not exists in the current context.
I have used the "workflow activity library" template to create the project.

sabyasachi said...

Hi robin
Great post,this is exactly what i was looking for,but i am getting an error while building the project
like "InitializeComponent" does not exists in the current context,
i have used "workflow activity library" template for the project.

Thanks for your help

JDS said...

Hello,

I've got the action "Copy List Item Extended" showing up in SPD, however once I select the action it just comes up blank.

I've checked my WSS.ACTIONS file and here is what I have.


Action Name="Copy List Item Extended"
ClassName="CopyListItemExtended.List"
Assembly="CopyListItem, Version=1.0.0.0, Culture=neutral, PublicKeyToken=54d1a6fdf526a294"
AppliesTo="all"
Category="Sample"
>
RuleDesigner Sentence="Copy List %1 from this %2 to this %3 and from this %4 to this %5.">
FieldBind Field="ListItemID" Text="ItemID" DesignerType="TextArea" Id="1"/>
FieldBind Field="SrcUrl" Text="Source Site" DesignerType="TextArea" Id="2"/>
FieldBind Field="DstUrl" Text="Destination Site" DesignerType="TextArea" Id="3"/>
FieldBind Field="SrcListName" Text="Source List" DesignerType="TextArea" Id="4" />
FieldBind Field="DestListName" Text="Destination List" DesignerType="TextArea" Id="5" />
/RuleDesigner>
Parameters>
Parameter Name="ListItemID" Type="System.String, mscorlib" Direction="In" />
Parameter Name="SrcUrl" Type="System.String, mscorlib" Direction="In" />
Parameter Name="DstUrl" Type="System.String, mscorlib" Direction="In" />
Parameter Name="SrcListName" Type="System.String, mscorlib" Direction="In" />
Parameter Name="DestListName" Type="System.String, mscorlib" Direction="In" />
/Parameters>
/Action>


The Namespace in the CS file is 'CopyListItem' and I have the namespace = CopyListItem in the web.config. I also deployed and installed the DLL file as CopyListItem.dll.

Any idea what I've done wrong?

Thanks!
JD

JDS300 said...

Figured out what I was doing wrong. If you download the complete project, your WSS.ACTIONS file will need to have the CLASSNAME="CopyListItem.Activity1".

Thanks,
JD

Robin Meuré said...

Hi JD,

sorry for my late response, but you are indeed correct. I was/am still planning to update this post with a proper solution file that includes the whole thing (custom action file, proper dll, etc)

Anonymous said...

Hi Robin,

is there any way to get metadata from uploaded documents, and copy this documents based on some if-statements from the metadata ? my problem is, that the workflow always starts when the document is uploaded, but the mask to fill in metadata comes a step later...

thanks
Thomas

Robin Meuré said...

Hi Thomas,

what you can do is to modify your workflow and add an extra step where you specify
"if 'metadatafield' is 'equal to blank' and put an action on there that says to 'wair for a fielditem to change' and let that equal 'not blank'.

Thomas said...

Hi Robin,

thank you for your hint. But I don't know exactly how to build in this additional step. I develope my workflow with Visual Studio and couldn't find an appropriate acitvity. Can you give me a hint which activity i can use?


thanks Thomas

Robin Meuré said...

Well I built my workflows in SharePoint Designer so I don't know how to do that. But you can create it in SPD and then export it to use it in Visual Studio (http://blogs.msdn.com/sharepointdesigner/archive/2007/07/06/porting-sharepoint-designer-workflows-to-visual-studio.aspx)

Obieg Dokumentow said...

And how about copying documents along with history and/or workflow history?

Robin Meuré said...

Well my code doesn't do that but you can extend it ;)

Anonymous said...

Robin,

Interesting capability. I am having a related problem (sort of) and wonder if you have any ideas. I'm trying to use Designer's Workflow actions to pull a value from a column field in the most recent item added to a list (not the current list, but another one). So I don't actually have a value to use to query the list, it just needs to be the most current list item. Are you aware of any SPD action that can do this or logic? I was hoping not to have to build a custom action in Visual Studio, but if I have to, any ideas on a function that would do this?

Thanks,

Robert Z.
Brooklyn, NY

curtis.hall said...

Robin,

I've followed your example and it's worked great for me. Thank you. It seems as though I've run into an issue that most of your commenters were seeking out.

When an item is created under USER_A, the copied item seems to be created by System Account. I'm guessing in pre-SP1 this was reversed such that the copied item was limited to the initiator of the first item added.

How do I go about coding it such that the user that creates the item is also noted as the user for the copied item? We need to track this for accountability.

Brajendu said...

Hello,

I've got the action "Copy List Item Extended" showing up in SPD, however once I select the action it just comes up blank.

I've checked my WSS.ACTIONS file and here is what I have.


Action Name="Copy List Item Extended"
ClassName="CopyListItem.Activity1"
Assembly="CopyListItem, Version=1.0.0.0, Culture=neutral, PublicKeyToken=54d1a6fdf526a294"
AppliesTo="all"
Category="Sample"
>
RuleDesigner Sentence="Copy List %1 from this %2 to this %3 and from this %4 to this %5.">
FieldBind Field="ListItemID" Text="ItemID" DesignerType="TextArea" Id="1"/>
FieldBind Field="SrcUrl" Text="Source Site" DesignerType="TextArea" Id="2"/>
FieldBind Field="DstUrl" Text="Destination Site" DesignerType="TextArea" Id="3"/>
FieldBind Field="SrcListName" Text="Source List" DesignerType="TextArea" Id="4" />
FieldBind Field="DestListName" Text="Destination List" DesignerType="TextArea" Id="5" />
/RuleDesigner>
Parameters>
Parameter Name="ListItemID" Type="System.String, mscorlib" Direction="In" />
Parameter Name="SrcUrl" Type="System.String, mscorlib" Direction="In" />
Parameter Name="DstUrl" Type="System.String, mscorlib" Direction="In" />
Parameter Name="SrcListName" Type="System.String, mscorlib" Direction="In" />
Parameter Name="DestListName" Type="System.String, mscorlib" Direction="In" />
/Parameters>
/Action>


The Namespace in the CS file is 'CopyListItem' and I have the namespace = CopyListItem in the web.config. I also deployed and installed the DLL file as CopyListItem.dll.

teen anal sex videos said...

girls are very small Ukrainian girl. Girl I refer to you, I may fit women it's life itself. The laziest bunch teen anal sex videos