none
exception al cambiar un campo en el xml de un document en form library - "este archivo ha sido modificado por...." RRS feed

  • Pregunta

  •  quiero modificar el xml de un elemento de un form library en el item updated event receiver, pero la segunda vez que le doy al botón de Guardar me dice que el archivo está modificado por otro usuario y no me deja grabar si no le cambio el nombre, pongo el código a continuación...

    public void SetValueToSPListItemXml(SPListItem item, string node, string value, SPItemEventProperties properties)
            {
                try
                {
                    properties.Web.AllowUnsafeUpdates = true;
    
                    SPFile file = item.File;
    
    
    
                    byte[] xmlFile = file.OpenBinary();
     XmlDocument xml = new XmlDocument();
    
                    using (MemoryStream ms = new MemoryStream(xmlFile))
                    {
                       // MemoryStream ms = new MemoryStream(xmlFile);
                        xml.PreserveWhitespace = true;
                        xml.Load(ms);
                       // ms.Close();
                    }
    
    
                    bool itemFound = false;
                    XmlNodeList nodes = xml.GetElementsByTagName("my:" + node);
                    foreach (XmlNode nodex in nodes)
                    {
                        nodex.InnerText = value;
                        itemFound = true;
                    }
    
                    //Get binary data for new XML
                    byte[] xmlData = System.Text.Encoding.UTF8.GetBytes(xml.OuterXml);
    
    
                    // only if we found the item we save it
                    if (itemFound)
                    {
                        using (MemoryStream myOutStream = new MemoryStream())
                        {
                            xml.Save(myOutStream);
                            file.SaveBinary(myOutStream.ToArray());
    
                        }
    
    
    
                    }
    
                }
                catch (Exception ex)
                {
                    addLog(ex.Message.ToString() + " trying to change the " + node + " to:" + value, "", properties);
    
                }
                finally
                {
                     properties.Web.AllowUnsafeUpdates = false;
                }
    
    
    
            }


    luis molina

    jueves, 4 de septiembre de 2014 22:42

Todas las respuestas

  • Luis, has un check-out/check in del SPFile para procesar el form.

    Ej:

    if (file.CheckOutType == SPFile.SPCheckOutType.None)
    {
        file.CheckOut();
    }

    //TU Código

    //en el finally agrega lo siguiente

    if (file.CheckOutType != SPFile.SPCheckOutType.None)
    {
        file.CheckIn("hago el check in");
    }

    También supongo que no tenés columnas obligatorias "por afuera" del mapeo de infopath.

    Saludos.

    viernes, 5 de septiembre de 2014 8:41
  • Encontré la solución, he añadido un botón cerrar que guarda los datos y cierra el formulario, el problema venía por querer grabar varias veces el item, cada vez que guardemos lo mejor es que cerremos el item.

    luis molina

    lunes, 1 de diciembre de 2014 11:24