0

SharePointSPListItemをに変換ListItemしてドロップダウン リストに入れようとしています。私の問題は、SharePoint リストのデータが次のように保存されていることです。

;#明け;#

;#デザイン;#従業員の関与;#

しかし、明らかにこれは私にはうまくいきません。;# 記号を削除する必要がありますが、これは単純である必要がありますString.Replaceが、いくつかの問題が発生しているのは、複数の選択を含むリスト項目に対して何をすべきかです (上記の 2 番目の例)。ここでの最終的な目標は、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 を指定したため、.NET Framework 3.5 が必要なため、LINQ の使用を避けています。また、各リスト項目に個別のトピック セットが含まれている限り、問題ありません。しかし、リスト アイテム間でトピックを繰り返すことができる場合は、このコードを変更し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によって返された を直接操作できますoList.GetItems(query)。に変換する必要はありませんDataTable

クエリにトピックフィールドを含めることを検討することもできViewFieldます。

フィールド値を手動で分割したくない場合は、SPFieldMultiChoiceValue クラスを使用できます。残念ながら、このクラスの選択肢にアクセスする便利な方法はありません。カウントとインデクサーしかないため、for ループを使用する必要があります。

于 2012-04-24T09:05:13.533 に答える