9

有没有办法使用 TFS 2012 API 以编程方式访问 WorkItem 的“看板列”?

使用 Scrum 2.2 模板,每当在 Board 上的 Kanban 列之间拖动工作项时,Bug 或 Product Backlog Item 的历史记录显示“[MyProject\MyTeam] Kanban Column”作为更改的字段,但该字段在特定情况下无法访问通过 TFS API 检索工作项。

在接口上WorkItemChangedEvent实现该ProcessEvent方法时,它还会在对象中显示为更改的字段。Microsoft.TeamFoundation.Framework.Server.ISubscriber

解决方法: 一位同事发现了一篇关于创建只读自定义字段以保持看板列的值的博文,利用WorkItemChangedEvent来捕获最新值。然后可以查询该列。这种方法的一个问题是只能跟踪单个团队的看板列。

更新: 根据这篇文,看板列不是一个字段,而是一个“WIT 扩展”。这可能有助于找到答案。

4

3 回答 3

6

我在 ISubscriber.ProcessEvent 方法中找到了一种使用 TFS 2013 API读取值的方法:

var workItemId = 12345;
var extService = new WorkItemTypeExtensionService();
var workItemService = new WorkItemService();
var wit = workItemService.GetWorkItem(requestContext, workItemId);
foreach (var wef in extService.GetExtensions(requestContext, wit.WorkItemTypeExtensionIds))
{
    foreach (var field in wef.Fields)
    {
        if (field.LocalName == "Kanban Column" || field.LocalName == "Backlog items Column")
        {
            // Access the new column name
            var columnName = wit.LatestData[field.Field.FieldId];
        }
    }
}
于 2013-11-06T22:32:21.757 回答
1

如果你准备好深入数据库,你可以挖掘出这些信息。我还不完全了解 TFS 中团队的建模,但首先您需要确定感兴趣的团队将看板状态存储在哪个字段 id 中,如下所示(TFS 2012):


 USE Tfs_DefaultCollection
 SELECT TOP(10)
        MarkerField + 1 as FieldId,* 
 FROM tbl_WorkItemTypeExtensions with(nolock) 
 JOIN tbl_projects on tbl_WorkItemTypeExtensions.ProjectId = tbl_projects.project_id
 WHERE tbl_projects.project_name LIKE '%ProjectName%

然后将下面的 XXXXXXXX 替换为上面发现的 FieldId


 SELECT TOP 1000 
        wid.Id, 
        wia.State, 
        wid.StringValue as Kanban, 
        wia.[Work Item Type], 
        wia.Title, 
        tn.Name as Iteration
 FROM tbl_WorkItemData wid with(nolock)
 JOIN WorkItemsAre wia on wia.ID = wid.Id
 JOIN TreeNodes tn on wia.IterationID = tn.ID
 WHERE FieldId = XXXXXXXX and RevisedDate = '9999-01-01 00:00:00.000'
 ORDER BY Id
于 2014-05-22T12:55:18.963 回答
0

我不熟悉 Scrum 2.2 模板,但在 TFS 工作项跟踪方面,CMMI 或 Scrum 模板的工作是相同的。

尝试这样的事情:

public string GetKanbanColumn(WorkItem wi)
{
    if (wi != null)
    {
        return wi["Kanban"].ToString();
    }
    return string.Empty;
}

取决于列的实际名称,在工作项模板 XML 文件中指定。希望这可以帮助。

于 2013-08-15T20:05:51.813 回答