0

我正在尝试将 SharePointSPListItem转换ListItem为放入下拉列表中。我的问题是 SharePoint 列表中的数据是这样存储的:

;#日光;#

;#设计;#员工敬业度;#

但显然这对我不起作用。我需要删除 ;# 符号,它应该很简单,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);
                }
            }
       }
4

3 回答 3

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包含一组不同的主题。

于 2012-04-24T13:25:34.363 回答
0

LINQ 它,类似于(伪代码)

...
var ddlItems = (from i in items
             select i["Topic"]).Distinct();
TopicDropDownList.Items.AddRange(ddlItems);
...
于 2012-04-23T23:06:19.213 回答
0

如果主题是一个多选字段,您可以按以下方式拆分字段值;#

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

TopicDropDownList.Items.AddRange(listItems);

可以直接对SPListItemCollection返回的 by进行操作oList.GetItems(query)。您无需将其转换为DataTable.

您可能会考虑在查询中包含主题字段ViewField

如果您不想手动拆分字段值,可以使用SPFieldMultiChoiceValue 类。不幸的是,没有方便的方法来访问此类中的选项。只有一个计数和一个索引器,因此您必须使用 for 循环。

于 2012-04-24T09:05:13.533 回答