【问题标题】:Get Item based on index from Sharepoint CAML Query to SPListItemCollection基于索引从 Sharepoint CAML Query 到 SPListItemCollection 获取项目
【发布时间】:2013-02-28 03:15:10
【问题描述】:

我正在尝试使用 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:值不在预期范围内。

【问题讨论】:

  • 您是否检查过该集合确实包含项目?如果您在类似col[0] 这样的命令上收到错误“值不在预期范围内”,这通常意味着一个空数组。

标签: sharepoint sharepoint-2010 caml


【解决方案1】:

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

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

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

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

并使用Id 获取项目:

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

还要注意,ID 属性的值与列表项集合中项的索引不同。此属性包含项目的从 1 开始的整数 ID,它比之前添加的项目的 ID 大一。如果项目被删除,它的 ID 不会被重用。[MoreInfo]

【讨论】:

    【解决方案2】:

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

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

    愚蠢的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-04
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多