2011-09-22 2 views
1
(1) var list1 = web.GetList("/lists/list1"); 
(2) var item1 = list1.GetItemById(10001); 
(3) ... 

de prendre le point d'arrêt ici, ouvrir l'élément avec ID = 10001 pour modifier, modifier les champs «Titre» et enregistrez-le. Ensuite, exécutez le code suivant:SPListItem Enregistrer le conflit pendant la mise à jour

(4)item1[SPBuiltInFieldId.Title] = "some text"; 
(5)item1.Update(); 

la ligne (5) déclenche l'exception de conflit de sauvegarde.

Comment bloquer un élément à modifier à la ligne (3)? Ou toute autre approche pour éviter les conflits?

Répondre

3

Vous devez vérifier la SPListItem manuellement

try 
{ 
    var item = list.GetItemById(3); 
    item["MyField"] = "FooBar"; 
    item.Update(); 
} 
catch(SPException conflictEx) 
{ 
    // handle conflict by re-evaluating SPListItem 
    var item = list.GetItemById(3); 
    // .. 
} 

Je ne connais aucun autre mécanisme atm.

+0

cela fonctionne, mais je pense qu'il existe une meilleure façon de verrouiller l'article direct – devi

0

Une autre approche utilise LINQ pour SharePoint, LINQ to SharePoint vous offre un mécanisme de résolution des conflits

+2

Pouvez-vous élaborer sur ce point? –

0

fournisseur LINQ de SharePoint est Interrogation des modifications simultanées lorsque vous essayez d'enregistrer les modifications que vous avez effectuées à l'aide de la méthode SubmitChanges.

Lorsqu'un conflit a été trouvé, une ChangeConflictException sera lancée.

foreach(var notebook in spSite.Notebooks) 
{ 
    notebook.IsTopNotebook = true; 
} 

try 
{ 
    spSite.SubmitChanges(ConflictMode.ContinueOnConflict); 
} 
catch(ChangeConflictException ex) 
{ 
    foreach(ObjectChangeConflict occ in spSite.ChangeConflicts) 
    { 
    if (((Notebook)occ.Object).Memory > 16) 
    {   
     foreach (MemberChangeConflict field in occ.MemberConflicts) 
     { 
     if (field.Member.Name == "IsTopNotebook") 
     { 
      field.Resolve(RefreshMode.KeepCurrentValues); 
     } 
     else 
     { 
      field.Resolve(RefreshMode.OverwriteCurrentValues); 
     } 
     } 
    } 
    else 
    { 
     occ.Resolve(RefreshMode.KeepCurrentValues); 
    } 
    } 
    spSite.SubmitChanges(); 
} 
2

// * créer un nouvel objet SPWeb pour chaque modification de la liste autrement nous obtenons Save Conflict *

de l'URL suivante http://platinumdogs.me/2010/01/21/sharepoint-calling-splist-update-causes-save-conflict-spexception/

exceptions

using (var thisWeb = featSite.OpenWeb(featWeb.ID)) 
     { 
      try 
      { 
       var listUpdate = false; 
       var theList = thisWeb.Lists[att.Value]; 

       // change list configuration 
       // ..... 

       // commit List modifications 
       if (listUpate) 
        theList.Update(); 
      } 
      catch 
      { 
       // log the event and rethrow 
       throw; 
      } 
     } 
    } 
} 
+0

bien! mais ce n'est pas toujours applicable. ex: les deux sites de mise à jour doivent utiliser le SPContext.CurrentWeb actuel – devi

+0

même 2 ans plus tard, votre message a enregistré mon (jour férié)! – Verthosa

Questions connexes