9

我正在尝试遍历 SPListItem.Versions 集合以查找最新批准的列表项。

我的列表项有三个版本:前两个已批准,最后一个是草稿。但是我的代码说它们都在草稿中!请帮忙!

// 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;
    }
}
4

3 回答 3

10

Mattias 推荐的方式和您实施的方式是最好的方式。这有点尴尬但仍然有效,因为这些项目是从最近到最旧的顺序排列的。这意味着您很可能会很快找到已发布版本的匹配项。

扩展MSDN SPListItemVersionCollection 文章(特别是 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]
于 2009-09-02T09:43:04.010 回答
9

item.Versions[index] 返回一个 SPListItemVersion 实例,SPListItemVersion.ListItem 返回父 SPListItem。因此,您的 versionedItem 最终将引用与 item 相同的对象,并且您一遍又一遍地检查相同的版本。

我相信你真的想检查

if (item.Versions[index].Level == SPFileLevel.Published) {
  // check item.Versions[index].VersionLabel
}
于 2009-09-02T07:37:13.700 回答
6

我的代码最终看起来像这样:

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

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

非常整洁,我真的希望它在部署到客户处时能正常工作!

于 2009-09-02T08:52:23.113 回答