根据Sharepoint CAML Query到SPListItemCollection的索引获取Item

时间:2013-02-15 21:53:15

标签: sharepoint sharepoint-2010 caml

我正在尝试使用caml查询列表项(第一次执行此操作)并根据修改日期对项目进行排序,以便我可以访问最新文档。但是,当我尝试根据ID失败时获取SPListItem时。

代码:

SPQuery query = new SPQuery();
String camlquery = "<OrderBy><FieldRef Name='Modified' Ascending='False' /></OrderBy>";                        
query.ViewAttributes = "Scope = 'Recursive'";
query.ViewFields = "<FieldRef Name='Modified' /><FieldRef Name='Title' /><FieldRef Name='Name' />";
query.Query = camlquery;
query.IncludeMandatoryColumns = true;
SPListItemCollection col = list.GetItems(query);


//failing here... I think   
SPListItem item = col.GetItemById(0);

有没有办法根据SPListItemCollection中的索引获取SPListItem?

我试过了

SPListItem item = col[0];

也没有运气。

以下是我遇到的错误:

价值不在预期范围内。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ArgumentException:值不在预期范围内。

2 个答案:

答案 0 :(得分:0)

如果你想使用SPListItem获得Id,那么你不需要去寻找,试试这个,

 SPSite oSite = new SPSite("http:/MyTestSite/");
 SPWeb oWeb = oSite.OpenWeb();
 SPList oList = oWeb.Lists["MyCustomList"];

 SPListItem oListItem = oList.Items.GetItemById(1);

但如果你坚持使用caml来获取它,请确保在Id caml查询中包含ViewFields

使用Id获取项目:

foreach (ListItem item in col)
{
    if(item["Id"] == 1) //Only an example
    {
        var itemFromId = item;
    }
}

另外需要注意的是,ID属性的值与列表项集合中的项目索引不同。此属性包含项目的基于1的整数ID,该ID大于先前添加的项目的ID。如果该项目已删除,则不会重复使用其ID。[MoreInfo]

答案 1 :(得分:0)

问题出在我回来的收藏品上。在使用该项目之前,我必须确保有结果:

if (col.Count > 0)
{
SPListItem item = col[0];
}

愚蠢的错误。