2012-04-23 9 views
0

Я пытаюсь преобразовать SharePoint SPListItem в ListItem, чтобы поместить в раскрывающийся список. Моя проблема заключается в том, что данные в списке SharePoint хранится так:Преобразование SharePoint SPListItem в выпадающий список ListItem

; #Daylight; #

; #Design; #Employee Обручальное; #

Но Очевидно, что это не работа для меня. Мне нужно удалить символы #, которые должны быть такими же простыми, как String.Replace, но где я столкнулся с некоторыми проблемами, что мне делать для элементов списка, которые содержат несколько выборов (мой второй пример выше). Конечной целью здесь является создание выпадающего списка (который не содержит дубликатов) всех элементов в списке SharePoint. Есть идеи?

 using (SPSite site = new SPSite(SPContext.Current.Web.Url.ToString())) 
     using (SPWeb oWebsiteRoot = site.OpenWeb()) 
     { 
      SPList oList = oWebsiteRoot.Lists["WplData"]; 
      SPListItemCollection items = null; 
      SPQuery query = new SPQuery(); 
      query.Query = "<Where><IsNotNull><FieldRef Name='Topic' /></IsNotNull>" + 
       "</Where><OrderBy><FieldRef Name='Topic' Ascending='True' /></OrderBy>"; 
      items = oList.GetItems(query); 
      DataTable tmpTable = new System.Data.DataTable(); 
      tmpTable = items.GetDataTable(); 
      DataView view = new DataView(tmpTable); 
      String[] columns = { "Topic" }; 
      DataTable table = view.ToTable(true, columns); 
      foreach (DataRow row in table.Rows) 
      { 
       foreach (var item in row.ItemArray) 
       { 
        ListItem listItem = new ListItem(); 
        listItem.Value = item.ToString(); 
        listItem.Text = item.ToString(); 
        TopicDropDownList.Items.Add(listItem); 
       } 
      } 
     } 

ответ

2

Вместо того, чтобы DataTable, попробуйте SPFieldLookupValueCollection:

SPList oList = oWebsiteRoot.Lists["WplData"]; 
SPListItemCollection items = null; 
SPQuery query = new SPQuery(); 
query.Query = "<Where><IsNotNull><FieldRef Name='Topic' /></IsNotNull>" + 
    "</Where><OrderBy><FieldRef Name='Topic' Ascending='True' /></OrderBy>"; 
items = oList.GetItems(query); 
foreach (SPListItem item in items) 
{ 
    SPFieldLookupValueCollection values = 
     new SPFieldLookupValueCollection(item["Topic"].ToString()); 
    foreach (SPFieldLookupValue value in values) 
    { 
     ListItem listItem = new ListItem(); 
     listItem.Value = value.LookupId.ToString(); 
     listItem.Text = value.LookupValue; 
     TopicDropDownList.Items.Add(listItem); 
    } 
} 

Примечание, так как вы указали SharePoint 2007, я избежать использования LINQ, потому что требует .NET Framework 3.5. Кроме того, если каждый элемент списка содержит отдельный набор тем, вы будете в порядке. Но если темы могут повторяться среди элементов списка, вы захотите изменить этот код так, чтобы TopicDropDownList содержит отдельный набор тем.

0

LINQ это, что-то вроде (psuedocode)

... 
var ddlItems = (from i in items 
      select i["Topic"]).Distinct(); 
TopicDropDownList.Items.AddRange(ddlItems); 
... 
0

Если Темы является многовариантным полем вы можете разделить значение поля с помощью ;#:

var listItems = items.Cast<SPListItem>() 
    .SelectMany(i => Convert.ToString(i["Topic"]).Split(";#", StringSplitOptions.RemoveEmptyEntries)) 
    .Distinct(); 

TopicDropDownList.Items.AddRange(listItems); 

Вы можете непосредственно работают на SPListItemCollection, которые возвращаются oList.GetItems(query). Вам не нужно преобразовывать его в DataTable.

Вы можете подумать о том, чтобы указать Тема поле ViewField в вашем запросе.

Если вы не хотите разделить значение поля вручную, вы можете использовать SPFieldMultiChoiceValue class. К сожалению, нет никакого удобного способа доступа к выбору в этом классе. Существует только счетчик и индекс, поэтому вам нужно использовать for-loop.