我正在尝试确定要在MOSS列表中创建的下一个列表项的ID是什么。有没有办法做到这一点?
谢谢,MagicAndi
答案 0 :(得分:0)
以下CAML查询将确定下一个要生成的最可能的ID:
int iNextID = 1;
try
{
using (SPSite objSite = new SPSite(sSiteUrl))
{
using (SPWeb objWeb = objSite.OpenWeb())
{
SPList objList = objWeb.Lists[sListName];
SPQuery objQuery = new SPQuery();
// objQuery.RowlImit = 1;
objQuery.Query = "<OrderBy><FieldRef Name='ID' Ascending='False' /></OrderBy><RowLimit>1</RowLimit>";
objQuery.Folder = objList.RootFolder;
// Execute the query against the list
SPListItemCollection colItems = objList.GetItems(objQuery);
if (colItems.Count > 0)
{
string sMaxID = colItems[0]["ID"].ToString();
iNextID += int.Parse(sMaxID);
}
}
}
}
catch (Exception ex)
{
...
}
return iNextID;
但是,这对于最近生成的列表项(ID为N)被删除的情况不起作用,然后我们使用上面的代码给出下一个ID - 它将返回N,当它应该是N时1。
答案 1 :(得分:0)
看看这个链接:http://snipplr.com/view/24210/next-splistitem-id-from-splist/,我已经尝试过这个解决方案,它确实克服了其他缺点,它涉及查询WSS内容数据库,这可能会有点贵,但你可以实现一个混合解决方案,如果colItems.Count在另一个逻辑之后== 0,你将只查询DB。
问候!
答案 2 :(得分:0)
如果你想更加确定你可以创建一个listitem,记录它的ID,删除列表项,下一个listitem将有ID + 1。这应该克服最后一项被删除的情况。
当然这很好..但是从内容数据库中读取也是如此。
我可以问你为什么需要它吗?或者,您可以在列表中添加一个包含GUID的列,以便您自己预先生成ID。
答案 3 :(得分:0)
我找到了解决这个问题的另一种方法。
我遇到的问题与版本有关:
var newItem = myList.Items.Add();
newItem["Title"] = "whatever";
newItem.Update();
newItem["MyProperty"] = "whatever" + newItem.ID;
newItem.Update();
我在列表上进行了版本控制,但不想创建我的新项目的两个不同版本。 像这样解决了:
var newItem = myList.Items.Add();
newItem["Title"] = "whatever";
newItem.Update();
myList.EnableVersioning = false;
myList.Update();
newItem["MyProperty"] = "whatever" + newItem.ID;
newItem.Update();
myList.EnableVersioning = true;
myList.Update();
有人可能会认为关闭版本会删除除当前版本之外的所有版本,但事实并非如此。
这不会为您提供下一个ID,但可能会解决某人的潜在问题。