【问题标题】:Converting a SharePoint SPListItem into a Drop down ListItem将 SharePoint SPListItem 转换为下拉 ListItem
【发布时间】:2012-05-04 12:34:05
【问题描述】:

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

;#日光;#

;#Design;#Employee Engagement;#

但显然这对我不起作用。我需要删除应该像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);
                }
            }
       }

【问题讨论】:

    标签: c# asp.net sharepoint-2007 sharepoint-list


    【解决方案1】:

    LINQ 它,类似于(伪代码)

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

    【讨论】:

      【解决方案2】:

      如果主题是一个多选字段,您可以将字段值拆分为;#

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

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

      您可以考虑将 Topic 字段作为ViewField 包含在您的查询中。

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

      【讨论】:

        【解决方案3】:

        试试SPFieldLookupValueCollection,而不是DataTable:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-11
          • 1970-01-01
          • 1970-01-01
          • 2011-03-26
          • 2021-10-05
          • 1970-01-01
          • 2020-04-21
          • 1970-01-01
          相关资源
          最近更新 更多