2010-04-30 66 views
11

局勢:以編程方式設置TaxonomyField在列表項上

我在術語庫中有一堆術語以及使用它們的列表。

許多術語尚未使用,並且在TaxonomyHiddenList中尚不可用。 如果他們還沒有,他們沒有一個ID,我不能將它們添加到列表項。

有一種方法GetWSSIdOfTermMicrosoft.SharePoint.Taxonomy.TaxonomyField這應該返回一個特定網站的術語的ID。

如果該術語已被使用且存在於TaxonomyHiddenList中,則返回ID,但如果不是則返回0。

是否有任何方式以編程方式向TaxonomyHiddenList添加條款或強制它發生?

回答

5

在MSDN上,您可以找到如何創建一個術語並將其添加到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(); 
    } 
} 
+0

tagsField.SetFieldValue(myItem ,myTerm); myItem.Update() 這是最乾淨的方式。如果SharePoint團隊改變了他們的字符串格式等,上面的內容有可能中斷 – statto 2013-03-18 10:43:46

8

不要使用

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

,因爲當你想抓取這個項目,你將有錯誤。

對於在分類字段設置值,你剛纔使用:

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

問候

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);