以编程方式在列表项上设置TaxonomyField

时间:2010-04-30 15:43:22

标签: sharepoint sharepoint-2010

情况:

我在Term Store中有一堆术语和一个使用它们的列表。

许多术语尚未使用,但在TaxonomyHiddenList中尚未提供。 如果他们还没有,那么他们没有ID,我也无法将它们添加到列表项中。

GetWSSIdOfTerm上有一个方法Microsoft.SharePoint.Taxonomy.TaxonomyField,它应该返回特定网站的字词ID。

如果该术语已经被使用并且存在于TaxonomyHiddenList中,则返回ID,但如果不是,则返回0。

有没有办法以编程方式将术语添加到TaxonomyHiddenList或强制它发生?

3 个答案:

答案 0 :(得分:8)

不要使用

TaxonomyFieldValue tagValue = new TaxonomyFieldValue(termString);
myItem[tagsFieldName] = tagValue;"

因为当您要抓取此项时会出现错误。

要在分类法字段中设置值,您只需使用:

tagsField.SetFieldValue(myItem , myTerm);
myItem.Update();"

此致

答案 1 :(得分:7)

如果使用

string termString = String.Concat(myTerm.GetDefaultLabel(1033),
                                            TaxonomyField.TaxonomyGuidLabelDelimiter, myTerm.Id);  

然后在实例化TaxonomyFieldValue

期间
TaxonomyFieldValue tagValue = new TaxonomyFieldValue(termString);
消息

将抛出

异常

  

价值不在预期范围内

您还提供WssId来构建术语字符串,如下所示

// We don't know the WssId so default to -1
       string termString = String.Concat("-1;#",myTerm.GetDefaultLabel(1033),
                                                    TaxonomyField.TaxonomyGuidLabelDelimiter, myTerm.Id);  

答案 2 :(得分:5)

在MSDN上,您可以找到如何创建Term并将其添加到TermSet。样本由TermSetItem class description提供。 TermSet应该有一个继承自TermSetItem的方法CreateTerm(name,lcid)。因此,您可以在int catch语句下面的示例中使用它,即:

catch(...)
{
   myTerm = termSet.CreateTerm(myTerm, 1030);
   termStore.CommitAll();
}

至于将术语分配给列表,此代码应该有效(我不确定“标签”字段的名称,但是很容易找到分类字段的正确内部名称):

using (SPSite site = new SPSite("http://myUrl")) 
{
    using (SPWeb web = site.OpenWeb())
    {
        string tagsFieldName = "Tags";
        string myListName = "MyList";
        string myTermName = "myTerm";

        SPListItem myItem = web.Lists[myListName].GetItemById(1);
        TaxonomyField tagsField = (TaxonomyField) myList.Fields[tagsFieldName];
        TaxonomySession session = new TaxonomySession(site);
        TermStore termStore = session.TermStores[tagsField.SspId];
        TermSet termSet = termStore.GetTermSet(tagsField.TermSetId);
        Term myTerm = null;

        try
        {
            myTerm = termSet.Terms[myTermName];
        }
        catch (ArgumentOutOfRangeException)
        {
            // ?
        }

        string termString = String.Concat(myTerm.GetDefaultLabel(1033),
                                            TaxonomyField.TaxonomyGuidLabelDelimiter, myTerm.Id);

        if (tagsField.AllowMultipleValues)
        {
            TaxonomyFieldValueCollection tagsValues = new TaxonomyFieldValueCollection(tagsField);
            tagsValues.PopulateFromLabelGuidPairs(
                String.Join(TaxonomyField.TaxonomyMultipleTermDelimiter.ToString(),
                            new[] { termString }));
            myItem[tagsFieldName] = tagsValues;

        }
        else
        {
            TaxonomyFieldValue tagValue = new TaxonomyFieldValue(termString);
            myItem[tagsFieldName] = tagValue;
        }
        myItem.Update();
    }
}