如何修改TFS WorkItemType> FieldDefinition>在C#中以编程方式使用AllowedValues?

时间:2013-09-10 07:17:18

标签: c# tfs workitem

我在XML中创建了一个新的工作项类型,并通过命令提示符导入它: witadmin importwitd ...

假设我在XML中定义了一个字段:

<FIELD name="severity" refname="MySeverity" type="String">
  <ALLOWEDVALUES>
    <LISTITEM value="High"/>
    <LISTITEM value="Medium"/>
  </ALLOWEDVALUES>
</FIELD>

现在,我想修改这个FieldDefinition,并添加另一个LISTITEM,说“低”。 我发现可以通过更改XML并重新导入它来完成。 我的问题是,有没有办法在C#中以编程方式这样做?

有关详细信息,我已设法通过以下代码查询字段定义:

TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri(my_uri));
WorkItemStore wistore = (WorkItemStore)tpc.GetService(typeof(WorkItemStore));
WorkItemType witype = wistore.Projects["MyProject"].WorkItemTypes["MyWorkItemType"];
for (int i = 0; i < witype.FieldDefinitions.Count; ++i)
{
    FieldDefinition fd = witype.FieldDefinitions[i];
    // Not able to modify fd and save.
}

如果有人能够对此有所了解,我会很感激。 提前谢谢!

1 个答案:

答案 0 :(得分:0)

无法以编程方式修改列表值。如果你想像你说的那样将值与表同步,那么如果以编程方式执行它是不可能的,因为无法将表Id或代码与字段值一起存储。

如果您确实需要同步部分,那么您可以尝试使用一些疯狂的解决方法。您可以像平常一样使用xml存储允许的值以进行显示。之后,在一组单独的允许值中,您可以为用户组名称“xxxx”指定隐藏的索引值列表,以便它不会显示。 在此隐藏列表中,您可以存储表的当前状态的“TableId = ValueName”映射。 然后,下次修改其中一个字段时,您可以引用此列表并获取该值的先前名称,并在索引和显示列表中对其进行修改。 然后,您可以使用此相同的索引列表来维护工作流和FormLayout的设置。

参考以下示例...

<ALLOWEDVALUES>
   <GLOBALLIST name="globalListName" />
   <LISTITEM value="Name1" />
   <LISTITEM value="Name2" />
   <LISTITEM value="Name3" />
. . . 
</ALLOWEDVALUES>

<ALLOWEDVALUES for="xxxxxx" expanditems="false">
   <GLOBALLIST name="globalListName" />
   <LISTITEM value="Id1=Name1" />
   <LISTITEM value="Id2=Name2" />
   <LISTITEM value="Id3=Name3" />
. . . 
</ALLOWEDVALUES>

非常开箱即用,但如果绝对必要,可以使用。