“Send To” function in WSS 3.0 does not copy look-up fields

The "Send To" function of WSS 3.0 does not copy look-up fields when you copy a non-Office document (like doc, xls etc) for 1 list to another. This is because the scope of the Look-Up field is the same web that the source document is at; whereas the “Send To” feature allows you to copy an item to any list on any SharePoint site, even if not in the same server. The Look-Up field needs to exist in an existing list on the target site. The sending site has no way to ensure this, and therefore does not attempt to copy this meta-data.

In the case of Office documents, the fields are stored as meta-data inside the documents itself. This issue is only for non-Office documents.

The easiest workaround would be to create an event handler (ItemAdded event) for the destination list, which fires every time an item is added to the target list. The code inside this handler can use the list item's "CopySource" property to identify the source of the document/item, and then copy the values over from the item's fields.

Following is an example of how an ItemAdded event handler can look like for this situation.

    1: public override void ItemAdded(SPItemEventProperties properties) 
    2: { 
    3:     DisableEventFiring(); 
    4:     try 
    5:     { 
    6:         using (SPSite site = new SPSite("https://site:80/")) 
    7:         { 
    8:             using (SPWeb web = site.OpenWeb()) 
    9:             { 
   10:                 //Target list 
   11:                 SPList list = web.Lists[properties.ListId]; 
   12:                 SPListItem item = list.Items[properties.ListItem.UniqueId]; 
   13:                 
   14:                 //Get the source URL 
   15:                 string source = item.CopySource; 
   16:                 
   17:                 //Determine the list name 
   18:                 char[] delimiters = new char[1] { '/' }; 
   19:                 string[] subStrings = source.Split(delimiters); 
   20:                 SPList sourceList = web.Lists[subStrings[3]]; 
   21:                 Guid guid = GetItemID(sourceList, subStrings[4]); 
   22:                 
   23:                 //Get the source item SPListItem 
   24:                 sourceItem = sourceList.Items[guid]; 
   25:                 
   26:                 //Get the look up field and save 
   27:                 item["LookUp"] = sourceItem["LookUp"]; 
   28:                 item.Update(); 
   29:             } 
   30:         } 
   31:     } 
   32:     catch (Exception ex) { } 
   33:     finally 
   34:     { 
   35:         EnableEventFiring(); 
   36:     } 
   37: } 

As always… Happy Coding image

Comments

  • Anonymous
    October 04, 2010
    //Target list   11:                 SPList list = web.Lists[properties.ListId];   12:                 SPListItem item = list.Items[properties.ListItem.UniqueId];   13:                   14:                 //Get the source URL   15:                 string source = item.CopySource; But item.copysource returns a empty string Kinldy help