2009-08-06 1 views
3

Я пытаюсь определить, каким будет идентификатор следующего элемента списка, который будет создан в списке MOSS. Есть ли способ сделать это?Определить следующий идентификатор SPListItem в SPList MOSS?

Спасибо, MagicAndi

+1

Это вопрос, который должен заставить вас переосмыслить ваш подход. Зачем вам нужно знать будущее? Для чего вам нужно это значение? –

ответ

0

Следующая CAML запрос будет определить наиболее вероятный идентификатор генерируется в следующем:

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; 

Однако, это не работает для случая, когда в последний раз генерируется список элементов (с идентификатором N), и затем мы используем приведенный выше код, чтобы дать следующий идентификатор - он вернет N, когда он должен быть N + 1.

+1

Да, это также не сработает, если вы удалите все свои элементы в списке, код вернет 1, хотя внутренне все еще держит счет – murki

0

Посмотрите на эту ссылку: http://snipplr.com/view/24210/next-splistitem-id-from-splist/, я пробовал это решение, и он преодолевает другие недостатки, он включает в себя запрос БД контента, который может быть немного дороже, но вы можете реализовать гибридное решение, в котором вы будет запрашивать БД ТОЛЬКО, если colItems.Count == 0 после другой логики.

С уважением!

0

Если вы хотите быть более уверенным, вы можете создать список, записать его идентификатор, удалить элемент списка, а следующий список будет иметь идентификатор + 1. Это должно привести к тому, что последний элемент был удален.

Конечно, это довольно uqly .. но так же читается из базы данных контента.

Могу ли я спросить, зачем вам это нужно? Кроме того, вы можете добавить столбец в свой список, содержащий GUID, чтобы вы могли предварительно генерировать идентификаторы самостоятельно.

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(); 

Можно было бы подумать, что включение версий от сотрет все версии, кроме тока, но это не так.

Это не дает вам следующий идентификатор, но может решить основную проблему для кого-то.

+0

Вместо того, чтобы выключать и управлять версиями, лучшим решением является вызов newItem.SystemUpdate (false) для обновления элемента без запуска новой версии. Надеюсь это поможет! –

Смежные вопросы