Pregunta

Estoy tratando de recorrer la colección SPListItem.Versions para encontrar el último elemento de la lista aprobada.

Mi elemento de la lista tiene tres versiones: los dos primeros están aprobados, el último es en el proyecto. Pero mi código dice que están todos en el proyecto! Por favor, ayuda!

// Iterate through all versions
for (int index = 0; index < item.Versions.Count; index++)
{
    SPListItem versionedItem = item.Versions[index].ListItem;

    // Check if moderation information is set to approved
    if (versionedItem.ModerationInformation.Status.Equals(SPModerationStatusType.Approved))
    {
        // We found an approved version!
        itemFound = versionedItem;
    }
}
¿Fue útil?

Solución

item.Versions [índice] devuelve una instancia SPListItemVersion, y SPListItemVersion.ListItem devuelve el SPListItem padres. Por lo que su versionedItem va a terminar refiriéndose al mismo objeto como elemento, y que está marcando la misma versión de una y otra vez.

Creo que realmente quiere comprobar

if (item.Versions[index].Level == SPFileLevel.Published) {
  // check item.Versions[index].VersionLabel
}

Otros consejos

La forma Mattias recomienda y se ha implementado es la mejor manera de hacerlo. Es un poco incómodo, pero todavía eficiente como los elementos se ordenan del más reciente al más antiguo. Esto significa que es probable que obtenga una coincidencia en la versión publicada de forma rápida.

En desarrollo de su MSDN SPListItemVersionCollection artículo (específicamente Además de Sebastian Wojciechowski):

// Current version of the item (note: this may be a draft)
SPListItem.Versions[0]

// Previous version of the item
SPListItem.Versions[1]

// First version of the item
SPListItem.Versions[SPListItem.Versions.Count - 1]

Mi código terminó con este aspecto:

if (doclist.EnableVersioning)
{
    SPListItemVersionCollection allVersions = item.Versions;

    // Iterate through all versions
    foreach (SPListItemVersion version in allVersions)
    {
        if (version.Level == SPFileLevel.Published)
        {
            itemFound = version.ListItem;
        }
    }
}

Bastante limpio y realmente espero que funcione cuando se despliega en el cliente!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top